grammar h1;
column_name
: '"' ALPHANUMERIC '.' ALPHANUMERIC '"'
;
ALPHA : [a-zA-Z]+ ;
fragment ALPHANUMERIC : ALPHA (ALLOWEDATTCHAR)* ;
fragment ALLOWEDATTCHAR : '-' | '_' | [0-9] | ALPHA ;
我试图匹配"Hello.World"
,其中单词之间的.
是强制性的,但是我的语法似乎不起作用。如何解决?另外,如果可能的话,我希望在点之前和之后至少有一个字符。
答案 0 :(得分:2)
您似乎想匹配"Hello.World"
作为完整的令牌。如果没有,请告诉我。为此,一个非常简单的方法就足够了:
DOT: '.';
String: '"' ALPHANUMERIC ALPHANUMERIC* (DOT ALPHANUMERIC ALPHANUMERIC*)? `"`;
column_name: String;
这是String
规则的作用:首先匹配双引号,然后匹配单个字母数字字符。之后,匹配零个或多个以下字母数字字符,直到看到一个点或另一个双引号为止。如果找到了DOT,则匹配另一个单字母数字字符,然后再匹配零个或更多个此类字符,直到找到双引号为止。
别忘了为空白添加规则,否则您将不得不在任何地方手动处理它们。通常,空白会被跳过或放在隐藏的频道上:
Whitespaces: [ \t\r\n]+ -> channel(HIDDEN);
这是使用稍微复杂一些的输入(Hel-lo.Wo_rld
)的这种方法的解析结果: