2012-04-16 13 views
0

フレックスとバイソンのチュートリアルをオンラインで調べてみると、それらはすべて簡単な例を使用して問題を解決しようとしています。フレックスとバイソンのパラメータとして関数を解析する

f(x,g(x)) 

これらの関数には、任意の数の引数を指定することもできます。次のような入力を含むファイルを解析する必要があります。

問題は、fとgの両方がパーサによって関数として扱われ、fが関数として、gがxのパラメータとして扱われなくてはならないということです。

[f,x,[g,x]] 

と好きではない:他の言葉で私はこのような出力を必要とする

[f, x, g(x)] 

は、誰かが私はそれをしませんですので、(最高これを行うと、おそらく正規表現を提供する方法を教えてもらえ彼らと良い?)?

答えて

2

レキシカル(フレックス)レベルでは、4つのトークンが識別子として認識されます(f、x、g、x)。構文(bison)レベルでは、g(x)とf(x、g(x))を式として認識します。非常に概略的に:

expression -> numeric-literal | 
       identifier | 
       identifier left-parenthesis arguments right-parenthesis 

arguments -> argument | 
      argument comma arguments 

argument -> expression 

この小さな例は、トークンの認識と構文解析の違いの風味を与えるだけです。

あなたはまた、として引数を解析できます。

arguments -> argument | 
      arguments comma argument 

またはあなたの問題に関連しないかもしれない可能性がある2の間にいくつかの微妙な違いがあります。

レキシカルレベルで識別子を認識する正規表現は、好きなものです。おそらく

[a-zA-Z][a-zA-Z0-9]* 

つまり、任意の数字と文字が続く文字。

最初にお読みになるのは、John Levineのlex & yaccです。私は彼のフレックス&バイソン、を使用していないが、私は以前の本の強さでそれをお勧めします。

0

もし何か単純な再帰正規表現(これはPerlにあります)。私はそれを徹底的に行う言語パーサで処理する方が良いと確信しています。

$str = 'some stuff F(g(x), tx, , 44, Y(hh()) , 99, b())'; 

$open  = '\b\w+\s*'; 

$regex = qr~ 
    (            # 1 
    ($open)          # 2 
    [(] 
     (           # 3      
      (?: (?> (?: (?!$open[(] | [)]) .)+) 
       | (?1)           
      )*            
     )             
    [)] 
    )             
~xs; 

print "Before: ", $str, "\n"; 
print "After: ", parse_func ($str), "\n"; 

### 
sub parse_func { 
    my ($core) = @_; 
    $core =~ s/$regex/ "[$2," . (parse_func($3)) . "]" /eg; 
    return $core; 
} 

出力

Before: some stuff F(g(x), tx, , 44, Y(hh()) , 99, b()) 
After: some stuff [F, [g,x], tx, , 44, [Y,[hh,]] , 99, [b,]] 
+0

要求された出力を生成しますが、質問は具体的には約あったように、これは、フレックス/バイソンではありません。 – origo

+1

@ user13733 - フレックス/バイソンについての質問は特にありましたが、受け入れられる解決策は本を読むことです。この答えの正規表現と生成された出力は、OPに必要なものです。 SOは理論の議論よりもソリューションボードのほうが多いです。私が掲示した例では、OPが本を読んだ後、彼は他に見たことのない実際的なつながりを見ることができます。動作中のフレックス/バイソン溶液を自由に投稿してください。 – sln

関連する問題