4

ネストされたifステートメントの正しい文法規則を書くのを誰かが手伝ってくれますか?私の言語では、次のような構文を書くことができます。

(IF CONDITION)
    some statements
    (IF CONDITION)
        some statements 
    (ELSE IF CONDITION) 
        some statements
    (ELSE IF CONDITION) 
        some statements
    (ELSE IF CONDITION) 
        some statements 
    (ELSE) 
        some statements
    (END) 
    some statements 
(ELSE IF CONDITION) 
    some statements 
(ELSE) 
    some statements 
(END)

RULE_OPENレクサーを書いたので、左右の括弧はRULE_CLOSEトークンです。「IF」はIFトークン、「END」はENDトークン、「ELSE」はELSEトークン、「CONDITION」はCONDITIONトークンです。

「いくつかのステートメント」は、私の言語で許可されているものであれば何でもよいと仮定します(一般的なプログラミング言語のように)。IFステートメントをおそらく無限にネストできることが重要です。

これが明確であることを願って、私がそれをひどく説明したかどうか私に知らせてください。

どんなに頑張っても。私は常にshift/reduceの競合を取得しており、パーサーは正しい入力を受け入れていません。

とはいえ、私は他の方法なしでルールを作成することに成功しました-if。else-ifのルールを追加すると、コードが非常に複雑になり始めます。

以下は、else-if部分なしでの私の成功したアプローチです(関連するルールのみをリストしました):

statements: statement

statements: statements statement

statement: code
| data_out
| rule

rule: inline_if_statement
| block_if_statement

block_if_statement: RULE_OPEN IF CONDITION RULE_CLOSE statements RULE_OPEN END RULE_CLOSE

block_if_statement: RULE_OPEN IF CONDITION  RULE_CLOSE statements block_else_statement

block_else_statement: RULE_OPEN ELSE RULE_CLOSE statements RULE_OPEN END RULE_CLOSE 

block_else_statement: empty

empty : 

これは構文解析で非常に一般的な問題だと思います。ここの誰かがすでにそれを解決していることを願っています:-)助けてくれてありがとう!

4

1 に答える 1

6

一般に、オプションのELSE句を持つ言語の単一のshift-reduce競合は許容できます。Pete Jinksは、競合を解決できるいくつかの代替定式化を提供しています。

ELSE-IF構造を指定するための戦略:これを他の再帰的に定義された繰り返しブロックと同じように扱います。

running_else_if_statement : RULE_OPEN IF CONDITION RULE_CLOSE statements else_if_blocks
    RULE_OPEN ELSE RULE_CLOSE statements RULE_OPEN END RULE_CLOSE
                          ;

else_if_blocks : else_if_block
               | else_if_blocks else_if_block
               ;

else_if_block : RULE_OPEN ELSE_IF CONDITION RULE_CLOSE statements 
              ;

スタイルに関する補足として:ほとんどの実務家は、あなたが行ってきた方法で、生産のためのすべての選択肢をパイプと一貫して組み合わせています

statement : code
          | data_out
          | rule
          ;

読むのは紛らわしいです:

statements : statement
           ;

statements : statements statement
           ;

最も好む:

statements : statement
           | statements statement
           ;
于 2012-07-12T17:24:38.767 に答える