java - antlr 词法分析器和解析器的转义字符
问题描述
我是 antlr 的新手并希望构建一个解析器,其中一部分需要我匹配字符串,但是我希望保留转义字符的含义
\0, \b, \t, \n, \f, \r, \", \', \\
其中一些符号在我的语言位置的语法中以各种方式使用,因此我希望通过以下方式定义一个 ESCAPE_CHAR 标记:
SINGLE_QUOTE: '\'' ;
DOUBLE_QUOTE: '"' ;
ESCAPE_ZERO : '\0' ;
ESCAPE_BACKSPACE : '\b' ;
ESCAPE_TAB : '\t' ;
ESCAPE_NEWLINE : '\n' ;
ESCAPE_FORMFEED : '\f' ;
ESCAPE_CARRIAGERETURN : '\r' ;
ESCAPE_BACKSLASH : '\\' ;
ESCAPE_CHAR: ESCAPE_ZERO | ESCAPE_BACKSPACE | ESCAPE_TAB | ESCAPE_NEWLINE | ESCAPE_FORMFEED | ESCAPE_CARRIAGERETURN | DOUBLE_QUOTE | SINGLE_QUOTE | ESCAPE_BACKSLASH ;
但是,ESCAPE_ZERO 给了我警告
non-fragment lexer rule ESCAPE_CHAR can match the empty string
当使 ESCAPE_ZERO 成为片段时,我看到了警告
invalid escape sequence \0
我是 antlr 的新手,所以我真的不知道我需要做些什么改变,任何帮助将不胜感激
解决方案
您还需要\
在 ANTLR 中转义内部文字。如果你不这样做,词法分析器规则ESCAPE_ZERO : '\0' ;
匹配空字符而不是反斜杠后跟零数字。而且这个空字符没有“宽度”,这会导致 ANTLR 产生错误[...] can match the empty string。
而不是所有单独的规则,尝试这样的事情:
STRING
: '"' ( ~[\\"\r\n] | ESCAPE_CHAR )* '"'
;
fragment ESCAPE_CHAR
: '\\' [0btnfr"'\\]
;
推荐阅读
- swift - 在 SwiftUI 视图中实现委托
- python - 使用 Tkinter 中的条目将数据添加到数据库
- php - 来自命令行的 Phar
- node.js - 成功登录后如何修复 isAuthenticated=false 且没有 req.user 数据
- powershell - 如何访问数组中的子对象?
- python - 离线python包安装需要连接吗?
- java - 如何在没有递归的情况下实现归并排序
- javascript - 获取音频集合的持续时间
- javascript - 在 VSCode 中构建自定义智能感知
- r - 将 ifelse() 与 R 和文本删除一起使用:如何处理 NA 值?