0

私はフレックスとバイソンのチュートリアルをオンラインで見て、私の問題を解決しようとしています。それらはすべて非常に単純な例を使用しており、私のものはより複雑です。次のような入力を含む可能性のあるファイルを解析する必要があります。

f(x,g(x))

これらの関数は、任意の数の引数を持つこともできます。

問題は、パーサーによって f と g の両方を関数として処理する必要があり、f を関数として、g を x のパラメーターとして持たないことです。つまり、次のような出力が必要です。

[f,x,[g,x]]

好きではない:

[f, x, g(x)]

誰かがこれを最善の方法で行い、おそらく正規表現を提供する方法を教えてもらえますか (私はそれらが得意ではないため)。

4

2 に答える 2

4

字句(フレックス)レベルでは、4つのトークン(f、x、g、およびx)を識別子として認識します。構文(バイソン)レベルでは、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]*

つまり、文字の後にオプションの数字と文字が続きます。

最初に良い本は、ジョン・レヴィンのlex&yaccでしょう。私は彼のフレックス&バイソンを使用していませんが、以前の本の強さでそれをお勧めします。

于 2012-04-16T20:26:35.513 に答える
1

単純な場合は、再帰的な正規表現かもしれません (これは 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,]]
于 2012-04-17T02:31:10.220 に答える