0

我在 Coco/R 中有一个悬空的问题。我尝试了解Coco/R 用户手册并询问 Google,但我无法自己解决问题。

我将问题简化为以下 Coco/R 语法(保存在 中new4.atg):

COMPILER Expr 
CHARACTERS

    digit   = '0'..'9'. 
    letter  = 'A'..'Z'.

TOKENS

    number  = digit { digit }.
    name    = letter { digit | letter }.    

PRODUCTIONS

    Expr = Test | Id Test.  
    Test = Test2.   
    Test2=Id | "(" Test ")".        
    Id=IdName|IdNumber.         
    IdName = name.  
    IdNumber = number.      

END Expr.

当我想用 构建编译器时coco.bat,我得到了这个答案:

Coco/R (Dec 22, 2014)
checking
new 4.atg(15,1): LL1 warning in Expr: number is start of several alternatives
new 4.atg(15,1): LL1 warning in Expr: name is start of several alternatives
parser + scanner generated
0 errors detected

在Google的最佳结果中,我读到我可以声明IF(isXXXFollowYYY())声明,但我不知道它如何以及是否是最佳解决方案。(在我的例子中:Expr = Test | If(isTestFollowID)Id Test。但是在哪里isTestFollowID声明?)

当我开始时,我不想收到任何警告coco.bat

4

1 回答 1

0

你的语法模棱两可。

Expr,在看到一个Id令牌后,解析器可以去

Expr -> Test -> Test2 -> Id

或者

Expr -> Id

LL(1) 解析器不知道要走哪条路径。

直接的问题可以通过在您的生产中拉出Id引入可选组件来解决:Expr

代替

Expr = Test | Id Test.  

你可以做

Expr = [Id] Test . 

然而,Test产生式也可以在其开头匹配 an Id,因此似乎需要进一步重构以使语法 LL(1)。

于 2016-09-12T19:45:40.877 回答