Antlr4-修正语法以匹配我的内部语言

时间:2019-04-09 15:22:36

标签: antlr4

我有一种内部语言,我需要在其中创建语法以解析该语言。但是由于某种原因,我无法匹配整个语言。

语言由这些关键字组成:

$IF
$FROM
$THEN
$ANY
$EMPTY
$NOT
$COMPLEX
$COUNT
$COUNT_COMPLEX

编译器单元或最简单的表达式或语句必须遵循以下顺序:

$IF ... $FROM ... $THEN

我能够匹配大多数组合。但是,我无法将值列表与任何值中间的空格匹配,例如:

$IF Mechanical Instability,Deformity $FROM Type


grammar Trigger;

prog:   expr EOF;

expr

 :      IF (ANY|EMPTY|NOT|comparator|count|complex|count_complex|IDENTIFIER|LIST_VALUES) FROM IDENTIFIER THEN
 |      expr binary expr
 |      LPAREN expr RPAREN
 ;


comparator : (GT | GE | LT | LE | EQ)(INT|IDENTIFIER);

binary     : AND | OR;

count      : COUNT LPAREN (IDENTIFIER | DISTINCT) RPAREN comparator;
complex    : COMPLEX LPAREN expr RPAREN;
count_complex : COUNT_COMPLEX LPAREN (expr | DISTINCT IDENTIFIER expr) RPAREN comparator;

IF                   : '$IF';
FROM                 : '$FROM';
THEN                 : '$THEN';
AND                  : '$AND' ;
ANY                  : '$ANY';
EMPTY                : '$EMPTY';
DISTINCT             : '$DISTINCT';
COUNT                : '$COUNT';
COUNT_COMPLEX        : '$COUNT_COMPLEX';
COMPLEX              : '$COMPLEX';
OR                   : '$OR' ;
NOT                  : '$NOT' LPAREN CHAR+(',' CHAR)*? RPAREN;
GT                   : '>' ;
GE                   : '>=' ;
LT                   : '<' ;
LE                   : '<=' ;
EQ                   : '=' ;
LPAREN               : '(' ;
RPAREN               : ')' ;
INT                  : '-'?[0-9]+[0-9]*;
IDENTIFIER           : [a-zA-Z_.'0-9]+;
LIST_VALUES          : IDENTIFIER(',' IDENTIFIER)* ;
CHAR                 : [a-zA-Z_0-9];
WS                   : [ \r\t\u000C\n]+ -> skip;

1 个答案:

答案 0 :(得分:0)

语法LIST_OF_VALUES中有一个词法分析器规则,因此值列表将被识别为单个标记。仅在令牌之间(而不是在一个令牌内)丢弃空格(或通常略过的令牌)。因此,如果您希望在某事物中间丢弃空格,则您不希望该事物成为单个标记。

因此,您应该拥有一个由多个标识符和逗号标记组成的解析器规则LIST_OF_VALUES,而不是使用词法分析器规则listOfValues。与$NOT的参数列表相同。