我有一种内部语言,我需要在其中创建语法以解析该语言。但是由于某种原因,我无法匹配整个语言。
语言由这些关键字组成:
$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;
答案 0 :(得分:0)
语法LIST_OF_VALUES
中有一个词法分析器规则,因此值列表将被识别为单个标记。仅在令牌之间(而不是在一个令牌内)丢弃空格(或通常略过的令牌)。因此,如果您希望在某事物中间丢弃空格,则您不希望该事物成为单个标记。
因此,您应该拥有一个由多个标识符和逗号标记组成的解析器规则LIST_OF_VALUES
,而不是使用词法分析器规则listOfValues
。与$NOT
的参数列表相同。