【问题标题】:ANTLR4 - Need an explanation on this String LiteralsANTLR4 - 需要对此字符串文字的解释
【发布时间】:2017-01-13 20:51:17
【问题描述】:

在我的作业中,我对字符串词法分析器有以下描述:

"字符串字面量包含零个或多个用双精度括起来的字符 引号 (")。使用转义序列(如下所列)表示特殊 字符串中的字符。这是新行的编译时错误 或 EOF 字符出现在字符串文字中。

所有支持的转义序列如下:

\b 退格

\f 换页

\r 回车

\n 换行

\t 水平制表符

\" 双引号

\反斜杠

以下是字符串字面量的有效示例:

"这是一个包含制表符\t的字符串"

“他问我:“约翰在哪里?””

字符串文字具有字符串类型。"

这是我的字符串词法分析器:

STRINGLIT: '"'(('\\'('b'|'t'|'n'|'f'|'r'|'\"'|'\\'))|~('\n'))*'"';

任何人都可以检查我的词法分析器是否符合要求?如果不是,请告诉我您的更正,我不太了解要求和ANTLR4。

【问题讨论】:

  • 我不知道 ANTLR,所以我不会发布实际答案。但请记住,正则表达式通常是“贪婪的”,并且会尽可能多地匹配。这意味着如果您的 STRINGLIT 被输入 "this is a test" + "foo bar baz" 它将匹配 整个 输入,而不仅仅是第一个引用的字符串。您需要从字符串中可能出现的字符中排除"(转义时除外)。
  • @JEarls ty,你的回答对我帮助很大

标签: regex string antlr antlr4 lexer


【解决方案1】:

使用 ANTLR4,您可以写 \\ [btn],而不是写 \\ ('b' | 't' | 'n')。此外,正如 J Earls 在评论中提到的,您需要在否定集中包含引号,以及 \r 和文字 \

这应该可以解决问题:

STRINGLIT
 : '"' ( '\\' [btnfr"'\\] | ~[\r\n\\"] )* '"'
 ;

【讨论】:

  • 非常感谢,还有一个小问题:'\\' 't''\t' 之间有什么不同吗?以此类推 \n \b \r.
  • '\\' 't''\\t' 相同,都是反斜杠后跟t\t 是水平制表符(十六进制0x09)。
猜你喜欢
  • 2015-11-06
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
相关资源
最近更新 更多