0

如果我定义了像普通对象访问这样的令牌:

[$_a-zA-Z]+[.] { return ACCESS; }
[$_a-zA-Z]+    { return ID; }
[+]            { return PLUIS;  }

还有 Bison 语法规则:

Accesses
    : Accesses ACCESS    { /*do something...*/ }
    | ACCESS             { /*do something...*/ }

Expression    
    : Accesses ID PLUS Accesses ID    { /*do something...*/ }

我想在源代码中允许这样的内容:

moduleA.valueB.valueC + valueD

在示例中,如果我不将空规则放入Accesses,则单个ID变量 likevalueD是非法的。但是如果我把空规则放进去,Accesses会导致严重的S/R冲突,匹配的文本会变得奇怪。

而且,我认为复制规则Expression不是一个好主意,例如:

Expression    
    : Accesses ID PLUS Accesses ID   { /*do something...*/ }
    | ID PLUS Accesses ID            { /*do something...*/ }
    | Accesses ID PLUS ID            { /*do something...*/ }
    | ID PLUS ID                     { /*do something...*/ }

我能找到其他方法来解决这个问题吗?

编辑:好的,感谢您的回答注意到我这个简单的语法没有冲突。至少你让我知道真正的问题可能隐藏在其他地方(对于编译器新手来说真是一团糟!)。

4

2 回答 2

1

你可以这样做: lex:

[$_a-zA-Z]+ {return WORD;}
"."         {return DOT;}
"+"         {return PLUS;}

野牛:

Expression   : Value PLUS Value;
Value        : WORD|WORD AccessList;
AccessElement: DOT WORD;
AccessList   : AccessElement|AccessList AccessElement;
于 2012-11-29T19:44:39.597 回答
1

在您的示例中仅使用 epsilon 产品没有任何问题:

Expression    
    : Accesses ID PLUS Accesses ID    { /*do something...*/ }
;

Accesses
    : Accesses ACCESS    { /*do something...*/ }
    |                    { /*do something...*/ }
;

没有冲突....

于 2012-11-30T00:07:25.813 回答