2011-07-18 9 views
0

私は、宿題のための正規表現のための再帰的なまともなパーサーを開発しようとしています。私はちょうど私が開発した文​​法が正しいかどうかのコミュニティをお願いしたかったか、私は正しい軌道に乗ってる場合:(最高に記載されているために:正規表現の曖昧でない文法

-= Regex Grammar (EBNF) =- 
    <start> -> <expr> '\n' 

    <expr> -> <expr> { '|' <term> }   // Union 
      | <expr> { <expr> }    // Concatenation 
      | <expr> '*'     // Closure 
      | <term> 

    <term> -> '(' <expr> ')' | <char>  // Grouping 
      | <char> 

    <char> -> a|b|c| ... |z 

いくつかのガイドライン:
1.優先順位最も低い)閉鎖、連結、連合
2.連合性:閉鎖は右結合である。連結/連合は左結合です
3.括弧でグループ化する必要があります

私の質問:上記の文法はガイドラインを満たしていますか?私は確信していますが、私は100%ではなく、いくつかの熟練した目がいくつかの問題/エラーを指摘できると考えていました。

TIA Noobの

+0

predecenceに問題があります。 PEG-Parserでこの文法を使用すると、間違った優先順位が使用され、LL-およびLR-パーサーはあいまいさについて不平を言うでしょう。それらを削除するには、演算ごとに1つのルールが必要です( 'expr'のためだけでなく)。 – CoronA

答えて

1
<start> 
<expr> 
<expr><expr> 
<expr><expr><expr> 
<term><term><term> 
'abc' 

第三工程では、まず<expr>または後者を拡張するかこれは、曖昧です。あなたは

<expr> -> <expr> { <expr> } 

を除去することによって、その回避し、代わりに

<term> -> <term> <expr> 

を作成することができるはずです。

あなたは

<term> -> '(' <expr> ')' | <char>  // Grouping 
     | <char> 

ここに自分自身を繰り返している(あなたが <char> 2回を持っている、あなたは、最初のルールで '(' <expr> ')' '|' <char>それを持っていることを意味しましたか?)私はそれを削除するには明確だと思う

<term> -> '(' <expr> ')' 

を作成し、代わりに

<expr> -> '(' <expr> ')' 

を作成してください。

さらに、文字を囲む引用符を<char>に追加する必要があります。

これは私があなたのEBNFをすばやく調べることからわかります。私は自分自身を勉強していたのでしばらくしていましたので、私の訂正の一部が間違っているかもしれません。

+0

あなたの提案された変更は、連結の上のkleeneスターの優先順位を打ち消すでしょう。 'aa *' == '(a)(a)*'と 'aa *'!= '(aa)*'。 – CoronA