0

私はsableccで言語パーサーのような単純なJavaを実装しようとしていますが、、およびステートメントを実装するときに常に問題が発生していshift-reduceます。reduce-reduceifwhileblock

たとえば、私は次のことを検討しました。

stmts= stmt*;

stmt= if_stmt| block_stmt| while_stmt;

block_stmt= { stmts }| ;;

while_stmt= while ( predicate ) { stmts }|while ( predicate ) ;

この文法は、例えば、あなたが何かの形をしているときに問題を引き起こします

while (true) ;

;パーサーは、 (から)だけを減らすか、 (から)block_stmt完全に減らすかを知ることができません。while (true);while_stmt

私はshift-reduce/reduce-reduce問題の理由をどこでも読んでいて、私はそれらを理解していると思います。しかし、1つはそれらの原因を知ることであり、もう1つはまったく異なることは、私がそれらを回避するように文法を構造化する方法を知ることです。私は非常に異なる方法で文法を実装しようとしましたが、それでも問題が発生します。

ss特定の/問題から実行しようとするのではなく、rrこの種の問題を回避するために、そのようなものに従うための一種のパラダイムが必要だと思いますか?私の問題への取り組み方は完全に間違っているに違いないと思います:(

これらすべての落とし穴に陥ることなく文法をゼロから構築する方法に関するリソースはありますか?この問題に関するリソースは、非常に簡単である(明らかなif then else問題を述べている)か、完全にフラグが立てられた文法である傾向があります。

4

1 に答える 1

2

問題は、たとえばセミコロンがwhile_stmtのセミコロンまたはblock_stmtのセミコロンとして解釈できるように文法が指定されていることです...申し訳ありませんが、{stmt}がRHSに2回表示されるため、どういうわけか文法が冗長になります。通常はあなたがします

 stmts ::= stmt | stmts stmt
 block_stmt ::= { stmts }
 stmt ::= ... | block_stmt | ;     // empty
 while_stmt ::= while ... stmt
于 2011-04-11T23:30:53.457 に答える