我如何编写一个与" x匹配的语法?

时间:2014-12-20 22:45:15

标签: antlr4

我正在设计一种低标点语言,我希望使用以下语法支持数组声明:

512 by 512 of 255  // a 512x512 array filled with 255
100 of 0 // a 100-element array filled with 0
expr1 by expr2 by expr3 ... by exprN of exprFill

这些数组声明只是众多声明中的一种。

我很难弄清楚如何编写语法规则。我把我的语法简化为最简单的再现我麻烦的东西:

grammar Dimensions;

program
  : expression EOF
  ;

expression
  : expression (BY expression)* OF expression
  | INT
  ;

BY : 'by';
OF : 'of';
INT : [0-9]+;
WHITESPACE : [ \t\n\r]+ -> skip;

当我输入10 of 1时,我得到了我想要的解析:

Parse tree of <code>10 of 1</code>

当我以20 by 10 of 1方式投放时,中间的expression非终端会向10 of 1投降,不会留下任何与规则OF expression匹配的内容:

Parse tree of <code>20 by 10 of 1</code>

我收到以下警告:

line 2:0 mismatched input '<EOF>' expecting 'of'

我想看的解析是

(program (expression (expression 20) by (expression 10) of (expression 1)) <EOF>)

有没有办法可以重新制定语法来实现这一目标?我觉得我需要的是BY和OF之间的权利关联,但我不知道如何在两个运营商之间表达这一点。

1 个答案:

答案 0 :(得分:0)

经过一些非智力实验,我想出了一些似乎产生我想要的解析的作品:

expression
  :<assoc=right> expression (BY expression)+ OF expression
  |<assoc=right> expression OF expression
  | INT
  ;

我不知道是否有一种方法可以用一次制作来表达它。