我正在使用ANTLR4,并在编写语法的过程中处理单引号和双引号。我正在尝试使用Lexer模式来限定字符串的范围,但这并不适用于我,我的语法如下所示。这是正确的方式,还是我如何正确地将这些解析器作为标记来解析,而不是使用上下文解析器规则。有洞察力吗?
举个例子:
'single quote that contain "a double quote 'that has another single quote'"'词汇语法
lexer grammar StringLexer;
fragment SQUOTE: '\'';
fragment QUOTE: '"';
SQSTR_START: SQUOTE -> pushMode(SQSTR_MODE);
DQSTR_START: QUOTE -> pushMode(DQSTR_MODE);
CONTENTS: ~["\']+;
mode SQSTR_MODE;
SQSTR_END: (CONTENTS | DQSTR_START)+ SQUOTE -> popMode;
mode DQSTR_MODE;
DQSTR_END:(CONTENTS | SQSTR_START)+ QUOTE -> popMode;解析器
parser grammar StringParser;
options { tokenVocab=StringLexer; }
start:
dqstr | sqstr
;
dqstr:
DQSTR_START DQSTR_END
;
sqstr:
SQSTR_START SQSTR_END
;增编谢谢@Lucas Trzesniewski的答复。
这是我为解析类似shell的语言而编写的语法的一部分,我可以有多行脚本,其中包含SQSTR和DQSTR。有了答案中提供的lexer规则,它将把多行脚本合并在一起。
愉快案例示例(使用答案正确解析):
cmd 'single quote string'
cmd2 "double quote"
cmd3 'another single quote' 它被识别为三个命令和三个字符串(单字符串和双字符串)。
未解析的示例:另一方面,请注意单引号字符串中的引号:
cmd 'single "quote string'
cmd2 "double quote"
cmd3 'another "single quote' 在这种情况下,它将错误地将它们全部检测为SQSTR类型的单个字符串令牌。
有什么办法解决这个问题吗?
发布于 2016-10-09 10:51:54
如果要将示例字符串解析为单个令牌,则不必使用lexer模式,可以使用相互递归的lexer规则:
SQSTR : '\'' (~['"] | DQSTR)* '\'';
DQSTR : '"' (~['"] | SQSTR)* '"';然后,在解析器中使用如下内容:
str : SQSTR | DQSTR;发布于 2016-10-09 09:13:10
你的想法太复杂了。你以前在哪里看到过这样的解决方案?(几乎) github上有这样规则的语法存储库中的所有语法都使用一种简单而工作良好的方法,其中有一个介绍器、内容和终止符,所有这些都在一条规则中,例如:
SQSTRING: '\'' .*? '\'';
DQSTRING: '"' .*? '"';类似地,对于具有这种结构的所有其他元素(单引号字符串、后勾引号字符串、多行注释等)。
https://stackoverflow.com/questions/39938926
复制相似问题