1

次のあいまいな文法があります。大文字の規則は単純な語彙トークン用です。

program : function | function program
function : FN ID ARROW TYPE invariants DASH block
fn_call : ID L_PAREN CONSTANT R_PAREN


invariants : invariant | invariant invariants
invariant : TYPE ID COLON invariant_tests
invariant_tests : test | test COMMA invariant_tests
test : OPERATOR CONSTANT | STAR


block : expression | expression block
expression : loop | fn_call | assignment | def | constant
loop : FOR def IN CONSTANT COLON block
assignment : ID ASSIGN CONSTANT | ID ASSIGN ID
def : TYPE assignment

8 つの shift/reduce エラーを受け取ります (Python 2.7 と PLY を使用している場合)。

あいまいさは、「1つ以上」を定義する方法の結果ですか? block : expression | expression block?

4

2 に答える 2

0

問題は、次のように定義した方法でしたloop:

loop : FOR def IN CONSTANT COLON block

ブロックがループに属しているのか、関数に属しているのかをパーサーが認識できなかったためです。

基本的に、ダングリングelse問題の別の変種です。

于 2013-07-15T07:34:20.753 に答える
0

前のスピーカーが言ったように、「ブロックの使用法」を区別する必要があります。たとえば、次を試してください。

loop : FOR def IN CONSTANT COLON block END FOR
于 2013-07-15T12:58:03.190 に答える