如何在没有 S/R 冲突的情况下使用 0 或 1+ 令牌编写野牛规则



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

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

野牛语法规则:

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

我想在源代码中允许此类内容:

moduleA.valueB.valueC + valueD

在示例中,如果我不将空规则放在Accesses中,则像valueD这样的单个ID变量是非法的。但是如果我把空规则放进去,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...*/ }

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

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

你可以这样做:莱 克 斯:

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

野牛:

Expression   : Value PLUS Value;
Value        : WORD|WORD AccessList;
AccessElement: DOT WORD;
AccessList   : AccessElement|AccessList AccessElement;

在您的示例中仅使用 epsilon 生产并没有错:

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

没有冲突。

最新更新