繁体   English   中英

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

[英]How to remove Left recursive in this ANTLR grammar?

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

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这种类型的语法。 (有很多这样的规则)

定义processTerm 然后写规则看起来像

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

        ....

如果你想要定义像seqComposition这样的东西,我认为那也没关系。 但是,您需要确保在继续执行规则时解析processExpansion将始终消耗更多文本。

阅读ANTLR wiki中删除左递归的指南。 这对我帮助很大。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM