繁体   English   中英

为什么使用字符 class 会使这个左递归?

[英]Why does using a character class make this left-recursive?

我有以下定义基本算术语法:

grammar Calc;


expression
    : '(' expression ')'                // parenExpression has highest precedence
    | expression ('*' | '/') expression // then multDivExpression
    | expression ('+' | '-') expression // then addSubExpression
    | OPERAND
    ;

// 12 or .12 or 2. or 2.38
OPERAND
    : [0-9]+ ('.' [0-9]*)?
    | '.' [0-9]+
    ;

它可以处理类似的事情:

1+2*3

但是,只要我将('*' | '/')更改为字符 class [*/]我就会收到以下错误:

在此处输入图像描述

添加一个字符 class 如何做到这一点? 还是因为我试图将其添加到解析器规则而不是词法分析器规则中,或者为什么会发生这种情况?

更新:从语法规则中提取字符 class 可以修复它,但很高兴了解原因:

expression
    : '(' expression ')'           // parenExpression has highest precedence
    | expression MULDIV expression // then multDivExpression
    | expression ADDSUB expression // then addSubExpression
    | OPERAND
    ;

MULDIV
    : [*/]
    ;

ADDSUB
    : [-+]
    ;

字符类仅适用于 Lexer 规则。

当您放置文字( '+''/'等)时,会为您定义隐式 Lexer 规则(并给出相当不可用的名称,例如T__1T__2等)。 所以它们只是插入隐式标记的便捷方式。 (字符 class 仅在实际的 Lexer 规则中可用。)

不确定您使用的是哪个版本的 ANTLR,但我收到“规则表达式没有定义的参数”错误,而不是相互左递归。

我认为您看到字符 class 语法在解析器规则中不可用的副作用。 [ ... ]语法在解析器规则中具有完全不同的含义。)

暂无
暂无

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

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