删除3个规则之间的左回

时间:2018-01-19 21:10:43

标签: parsing grammar antlr4

我试图用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))*;

但我在输入中找不到可行的选择' :/

0 个答案:

没有答案