ANTLR语法和语法谓词中的左值意识

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 =

我正在用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 = 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