【发布时间】:2019-11-28 21:28:55
【问题描述】:
我的 antlr 语法或(词法分析器)有问题。就我而言,我需要用自定义文本解析一个字符串并在其中查找函数。函数$foo($bar(3),'strArg')的格式。我在这篇帖子ANTLR Nested Functions 中找到了解决方案,并根据我的需要对其进行了一些改进。但是在测试不同的案例时,我发现了一个会阻止解析器的案例:$foo($3,'strArg')。这将引发 IncorectSyntax 异常。我尝试了许多变体(例如,不要跳过 $ 并将其包含在解析树中)但所有这些尝试都没有成功
词法分析器
lexer grammar TLexer;
TEXT
: ~[$]
;
FUNCTION_START
: '$' -> pushMode(IN_FUNCTION), skip
;
mode IN_FUNCTION;
FUNTION_NESTED : '$' -> pushMode(IN_FUNCTION), skip;
ID : [a-zA-Z_]+;
PAR_OPEN : '(';
PAR_CLOSE : ')' -> popMode;
NUMBER : [0-9]+;
STRING : '\'' ( ~'\'' | '\'\'' )* '\'';
COMMA : ',';
SPACE : [ \t\r\n]-> skip;
解析器
options {
tokenVocab=TLexer;
}
parse
: atom* EOF
;
atom
: text
| function
;
text
: TEXT+
;
function
: ID params
;
params
: PAR_OPEN ( param ( COMMA param )* )? PAR_CLOSE
;
param
: NUMBER
| STRING
| function
;
【问题讨论】:
-
3不是正确的函数名(定义为ID,即[a-zA-Z_]+)。 -
对于虚假信息,我深表歉意。我的意思是这是
$foo($3)不正确的情况,但解析器不会在$3处失败(对于解析器,它看起来像NUMBER非终端),如果您添加更多文本$foo($3) and some more text,它将失败。我不明白这是因为$跳过而你仍然处于IN_FUNCTION模式