我很抱歉要问关于相互左递归的另一个问题,我觉得我的情况对我的情况来说是独一无二的,或者至少我不能将它与其他人的语法联系起来。我对comp sci世界有点新(我自学java,这是我的目标语言,现在是ANTLR4),所以如果可能的话,请用非专业术语描述,而不是CS主要术语。相互左递归ANTLR 4
我正在写一个程序,需要代数和符号派生物,当然,这需要的东西被解析,树木操作,但我甚至不会担心,因为我认为ANTLR4支持直接左递归,但显然它不以某种方式。在输出中,它一直告诉我,我的方法[表达式]是相互左递归的,显然这是不允许的......? 我的问题:
1)有人可以解释左递归/相互和直接左递归之间的差异,如果有一个?
2)解释我的语法是什么导致了这种递归烦恼,以及如何解决它? 我不确定这是否是主题:
3)人们说有关替代品和标签替代品的事情(我认为它们的意思是#标签符号)。那个有什么用?
grammar MathProcessor;
@header {package utils;}
END: ';';
EQUALS: '=';
SIN: 'sin(';
COS: 'cos(';
TAN: 'tan(';
SEC: 'sec(';
CSC: 'csc(';
COT: 'cot(';
LN: 'ln(';
EPOW: 'pow(';
RPAREN: '(';
LPAREN: ')';
EXP: '^';
MULT: '*';
DIV: '/';
ADD: '+';
SUBT: '-';
VAR: ('a'..'z'|'A'..'Z');
INT: ('0'..'9')+;
mathobj: ((equation|expression) END) EOF;
equation: (expression '=' expression);
expression:
((RPAREN|SIN|COS|TAN|SEC|CSC|COT|LN|EPOW) expression (RPAREN)) #parenOps
| (expression EXP expression) #exponent
| (expression (MULT|DIV) expression) #multiplyDivide
| (expression (ADD|SUBT) expression) #addSubtract
| (VAR|INT) #varInt
;
非常感谢!它经过一些调整后最终生成,使我的语法树在ANTLRworks中看起来不错!我可以看出是否可以弄清楚如何使用它,或者它是否保留了操作的顺序,但我会在稍后留下。 – user3326093