首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使这一生产更加“模块化”

如何使这一生产更加“模块化”
EN

Stack Overflow用户
提问于 2022-08-20 05:42:20
回答 1查看 36关注 0票数 0

我有以下表达式组,其中所有内容都抛出到相同的expr规则中:

代码语言:javascript
复制
grammar MyGrammar;

expr
    : '(' expr ')'

    // BoolExressions -- cannot move these out or else get Left-Recursion
    | expr ('=' | '!=') expr
    | expr 'AND' expr
    | expr 'OR' expr

    | ATOM
    ;

ATOM: [a-z]+ | [0-9]+;
WHITESPACE: [ \t\r\n] -> skip;

它可以工作,但是我想提取boolExpression内容,这样我就可以单独使用它,因为我所拥有的其他规则必须使用布尔表达式而不是任何表达式。然而,一旦我这样做,我就会得到一个左递归错误。

有什么好方法来解决这个问题,这样我就可以将BooleanExpression分离开来了?理想情况下,我希望它“看起来像这样”:

代码语言:javascript
复制
grammar MyGrammar;

expr
    : '(' expr ')'
    | boolExpr
    | ATOM
    ;

boolExpr
    : expr ('=' | '!=') expr
    | expr 'AND' expr
    | expr 'OR' expr
    ;

ATOM: [a-z]+ | [0-9]+;

WHITESPACE: [ \t\r\n] -> skip;

// error(119): The following sets of rules are 
// mutually left-recursive [expr, boolExpr]
EN

回答 1

Stack Overflow用户

发布于 2022-08-20 11:23:24

它并不能给您提供一个boolExpr,但是您应该考虑使用标记的替代方案:

代码语言:javascript
复制
grammar MyGrammar;

expr
    : '(' expr ')'

    // BoolExressions -- cannot move these out or else get Left-Recursion
    | expr ('=' | '!=') expr   # compareExpr
    | expr 'AND' expr          # andExpr
    | expr 'OR' expr           # orExpr

    | ATOM
    ;

ATOM: [a-z]+ | [0-9]+;
WHITESPACE: [ \t\r\n] -> skip;

这会为每个选项创建单独的*上下文类,这大大降低了您的侦听器和访问者所处理的上下文的复杂性(显然会有更多的上下文)。符号的作用域也适用于每一种选择,这样您就可以执行如下操作:

代码语言:javascript
复制
grammar MyGrammar;

expr
    : '(' expr ')'

    // BoolExressions -- cannot move these out or else get Left-Recursion
    | lhs=expr ('=' | '!=') rhs=expr   # compareExpr
    | lhs=expr 'AND' rhs=expr          # andExpr
    | lhs=expr 'OR' rhs=expr           # orExpr

    | ATOM
    ;

ATOM: [a-z]+ | [0-9]+;
WHITESPACE: [ \t\r\n] -> skip;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73424355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档