私はsableccで言語パーサーのような単純なJavaを実装しようとしていますが、、およびステートメントを実装するときに常に問題が発生していshift-reduce
ます。reduce-reduce
if
while
block
たとえば、私は次のことを検討しました。
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
問題を述べている)か、完全にフラグが立てられた文法である傾向があります。