我试图用antlr4编写一个Lua解析器,但我正在努力解决这三个相互左递归的规则:
variable
: NAME
| prefixExpression '[' expression ']'
| prefixExpression '.' NAME;
prefixExpression
: variable
| functionCall
| '(' expression ')';
functionCall
: prefixExpression arguments
| prefixExpression ':' NAME arguments;
我已经阅读了关于左递归删除的理论,但我无法找到将理论应用于这个实际案例的方法......
感谢。
编辑:
使用此重构规则:
A: Aa | Ab | c | d | Ae; -> A: (c | d) (a | b | e)*;
我实现了删除相互递归:
// initial
// variable
// : NAME
// | ('(' expression ')' | variable | functionCall) '[' expression ']'
// | ('(' expression ')' | variable | functionCall) '.' NAME;
// first iteration
// variable
// : NAME
// | ('(' expression ')' '[' expression ']')
// | (variable '[' expression ']')
// | (functionCall '[' expression ']')
// | ('(' expression ')' '.' NAME)
// | (variable '.' NAME)
// | (functionCall '.' NAME);
// second iteration
variable
: (NAME | ('(' expression ')' '[' expression ']')
| (functionCall '[' expression ']')
| ('(' expression ')' '.' NAME)
| (functionCall '.' NAME))
(('[' expression ']') | ('.' NAME))*;
prefixExpression
: '(' expression ')' | variable | functionCall;
// initial
// functionCall
// : (functionCall | variable | '(' expression ')') arguments
// | (functionCall | variable | '(' expression ')') ':' NAME arguments;
// first iteration
// functionCall
// : (functionCall arguments)
// | (variable arguments)
// | ('(' expression ')' arguments)
//
// | (functionCall ':' NAME arguments)
// | (arguments ':' NAME arguments)
// | ('(' expression ')' ':' NAME arguments)
// ;
// second iteration
functionCall
: ((arguments variable) | ('(' expression ')' arguments)
| (arguments ':' NAME arguments) | ('(' expression ')' ':' NAME arguments))
(arguments | (':' NAME arguments))*;
但我在输入中找不到可行的选择' :/