如何在这个ANTLR语法中删除Left递归?

时间:2011-03-24 21:46:40

标签: parsing programming-languages antlr grammar

我正在尝试解析CSP(Communicating Sequential Processes)CSP Reference Manual。我已经定义了以下语法规则。

assignment
    : IDENT '=' processExpression
    ;
processExpression
    :   ( STOP
        | SKIP
        | chaos
        | prefix
        | prefixWithValue
        | seqComposition
        | interleaving
        | externalChoice

        ....

seqComposition
    :   processExpression ';' processExpression
    ;
interleaving
    :   processExpression '|||' processExpression
    ;
externalChoice
    :   processExpression '[]' processExpression
        ;

现在ANTLR报告了

seqComposition 
interleaving
externalChoice

是递归的。有没有办法删除这个或我应该更好地使用Bison Flex这种类型的语法。 (有很多这样的规则)

2 个答案:

答案 0 :(得分:3)

定义processTerm。然后编写类似

的规则
assignment
    : IDENT '=' processExpression
    ;
processTerm
    :   ( STOP
        | SKIP
        | chaos
        | prefix
        ...
processExpression
    :   ( processTerm
        | processTerm ';' processExpression
        | processTerm '|||' processExpression
        | processTerm '[]' processExpression

        ....

如果您想要定义seqComposition之类的内容,我认为也可以。但是,当您继续执行规则时,您需要确保processExpansion的解析始终会消耗更多文本。

答案 1 :(得分:1)

阅读removing left recursion in on the ANTLR wiki指南。它对我帮助很大。