ANTLR语法和语法谓词中的左值意识
我正在用ANTLR for D实现一个解析器。这种语言基于C语言,因此声明和表达式之间存在一些歧义。考虑这一点:ANTLR语法和语法谓词中的左值意识,antlr,lvalue,Antlr,Lvalue,我正在用ANTLR for D实现一个解析器。这种语言基于C语言,因此声明和表达式之间存在一些歧义。考虑这一点: a* b = c; // This is a declaration of the variable d with a pointer-to-a type. c = a * b; // as an expression is a multiplication. 由于第二个示例只能出现在赋值表达式的右侧,因此我尝试使用以下代码段解决此问题: expression : left =
a* b = c; // This is a declaration of the variable d with a pointer-to-a type.
c = a * b; // as an expression is a multiplication.
由于第二个示例只能出现在赋值表达式的右侧,因此我尝试使用以下代码段解决此问题:
expression
: left = assignOrConditional
(',' right = assignOrConditional)*
;
assignOrConditional
: ( postfixExpression ('=' | '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '~=' | '<<=' | '>>=' | '>>>=' | '^^=') )=> assignExpression
| conditionalExpression
;
assignExpression
: left = postfixExpression
( op = ('=' | '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '~=' | '<<=' | '>>=' | '>>>=' | '^^=')
right = assignOrExpression
)?
;
conditionalExpression
: left = logicalOrExpression
('?' e1 = conditionalExpression ':' e2 = conditionalExpression)?
;
也许我误解了谓词是如何工作的,因此,如果有人能纠正我对代码的解释,那就太好了:如果输入可以作为postfix表达式读取,它将检查postfix表达式后面的下一个标记是否是赋值运算符之一,如果是,它将把规则解析为assignmentExpression。(请注意,赋值表达式和条件表达式运行良好)。如果下一个标记不属于它们,它将尝试将其解析为条件表达式
编辑
[已解决]现在,这个解决方案还有一个我可以意识到的问题:assignmentExpression必须在其右侧选择表达式是否再次是赋值(也就是说,后缀和赋值运算符紧随其后),如果它被链接起来的话
你知道我的理解有什么问题吗
如果我向解释器提供任何输入
不要使用ANTLRWorks的解释器:它有缺陷,并且忽略任何类型的谓词。使用它的调试器:它可以完美地工作
如果输入可以作为postfixExpression读取,它将检查postfixExpression之后的下一个标记是否是赋值运算符之一,如果是,它将作为assignmentExpression解析规则
你说得对
编辑[已解决]现在,这个解决方案还有一个我可以意识到的问题:assignmentExpression必须在其右侧选择表达式是否再次是赋值(即,后缀和赋值运算符紧随其后),如果它是链接的
怎么了
如果我向解释器提供任何输入
不要使用ANTLRWorks的解释器:它有缺陷,并且忽略任何类型的谓词。使用它的调试器:它可以完美地工作
如果输入可以作为postfixExpression读取,它将检查postfixExpression之后的下一个标记是否是赋值运算符之一,如果是,它将作为assignmentExpression解析规则
你说得对
编辑[已解决]现在,这个解决方案还有一个我可以意识到的问题:assignmentExpression必须在其右侧选择表达式是否再次是赋值(即,后缀和赋值运算符紧随其后),如果它是链接的
怎么了
a = b
b-=c
d