ネストされた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 :
これは構文解析で非常に一般的な問題だと思います。ここの誰かがすでにそれを解決していることを願っています:-)助けてくれてありがとう!