在我的语言中,语句以换行符结尾,但我希望通过插入反斜杠-换行符将语句格式化为多行.

"This is a statement."
"This is also \
a statement."

我想不出如何跳过反斜杠--换行符.显然,ESC_NEWLINE不被识别,但我不知道如何修复它.感谢您的帮助.

词法分析器有

SKIP_TOKENS :  (WS | ESC_NEWLINE) -> skip;
ESC_NEWLINE : '\\'NEW_LINE;
NEWLINE : NEW_LINE;

COMMENT :   '//' ~('\n'|'\r')* ;

ID     :  (LETTER|'_') (LETTER|DIGIT|'_')* ;
STRING :  '"' ( ~('\\'|'"') )* '"' ;

fragment LETTER          : ('a'..'z' | 'A'..'Z') ;
fragment DIGIT           : ('0' | NON_ZERO_DIGIT);
fragment NON_ZERO_DIGIT  : [1-9] ;
fragment NEW_LINE        : \r?\n ;
fragment WS              : [ \t]+;

解析器是

script: line* EOF;

line: COMMENT NEWLINE
    | statement COMMENT? NEWLINE;


statement: STRING | ID;

推荐答案

ANTLR的词法分析器try 为词法分析器规则匹配尽可能多的字符.由于,输入中的\\n(反斜杠+换行符):

"This is also \
a statement."

永远不会成为可以跳过的令牌,然后让" ... "变成STRING令牌.您需要让反斜杠+换行符成为STRING标记的一部分:

STRING : '"' ( ~[\\"] | '\\' NEW_LINE )* '"';

fragment NEW_LINE : '\r'? '\n';

如果您不想让反斜杠+换行符成为STRING标记的一部分,则需要预先对输入进行预处理并将其go 掉.

Java相关问答推荐

当耗时的代码完成时,Circular ProgressIndicator显示得太晚

最小拓Flutter 排序的时间复杂度是多少?

使用Java Streams API比较两个不同的Java集合对象和一个公共属性

对运行在GraalVM-21上的JavaFX应用程序使用分代ZGC会警告不支持JVMCI,为什么?

GSON期间的Java类型擦除

PDFBox未加载内容

自定义批注的外推属性值

如何将其他属性引用到log4j2 yaml配置中?

我怎样才能让IntelliJ标记toString()的任何实现?

使用正则表达式从字符串中提取多个值

二进制数据的未知编码/序列化

Regex以查找不包含捕获组的行

JFree Chart从图表中删除边框

插入中的JOOQ序列,设置为VS值

Java 17与Java 8双重表示法

Java中的一个错误';s stdlib SocksSocketImpl?

PhantomReference无法访问时会发生什么?

[Guice/MissingImplementation]:未绑定任何实现

如何调查进程列表中不可见的活跃 MySQL 事务?

如何在 WebSphere Application Server 内的托管线程上运行 BatchEE 作业(job)?