首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ANTLR4中单引号和双引号字符串的处理范围

ANTLR4中单引号和双引号字符串的处理范围
EN

Stack Overflow用户
提问于 2016-10-09 00:59:21
回答 2查看 3.9K关注 0票数 0

我正在使用ANTLR4,并在编写语法的过程中处理单引号和双引号。我正在尝试使用Lexer模式来限定字符串的范围,但这并不适用于我,我的语法如下所示。这是正确的方式,还是我如何正确地将这些解析器作为标记来解析,而不是使用上下文解析器规则。有洞察力吗?

举个例子:

代码语言:javascript
运行
复制
'single quote that contain "a double quote 'that has another single quote'"'

词汇语法

代码语言:javascript
运行
复制
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;

解析器

代码语言:javascript
运行
复制
parser grammar StringParser;
options { tokenVocab=StringLexer; }

start:
    dqstr | sqstr
;

dqstr:
 DQSTR_START DQSTR_END
 ;  

sqstr:
 SQSTR_START SQSTR_END
;

增编谢谢@Lucas Trzesniewski的答复。

这是我为解析类似shell的语言而编写的语法的一部分,我可以有多行脚本,其中包含SQSTRDQSTR。有了答案中提供的lexer规则,它将把多行脚本合并在一起。

愉快案例示例(使用答案正确解析):

代码语言:javascript
运行
复制
cmd 'single quote string'
cmd2 "double quote"
cmd3 'another single quote' 

它被识别为三个命令和三个字符串(单字符串和双字符串)。

未解析的示例:另一方面,请注意单引号字符串中的引号:

代码语言:javascript
运行
复制
cmd 'single "quote string'
cmd2 "double quote"
cmd3 'another "single quote' 

在这种情况下,它将错误地将它们全部检测为SQSTR类型的单个字符串令牌。

有什么办法解决这个问题吗?

EN

回答 2

Stack Overflow用户

发布于 2016-10-09 10:51:54

如果要将示例字符串解析为单个令牌,则不必使用lexer模式,可以使用相互递归的lexer规则:

代码语言:javascript
运行
复制
SQSTR : '\'' (~['"] | DQSTR)* '\'';
DQSTR : '"'  (~['"] | SQSTR)* '"';

然后,在解析器中使用如下内容:

代码语言:javascript
运行
复制
str : SQSTR | DQSTR;
票数 3
EN

Stack Overflow用户

发布于 2016-10-09 09:13:10

你的想法太复杂了。你以前在哪里看到过这样的解决方案?(几乎) github上有这样规则的语法存储库中的所有语法都使用一种简单而工作良好的方法,其中有一个介绍器、内容和终止符,所有这些都在一条规则中,例如:

代码语言:javascript
运行
复制
SQSTRING: '\'' .*? '\'';
DQSTRING: '"' .*? '"';

类似地,对于具有这种结构的所有其他元素(单引号字符串、后勾引号字符串、多行注释等)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39938926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档