当前位置: 首页 > 知识库问答 >
问题:

如何使用ANTLR 4转义转义角色?

东方文林
2023-03-14

许多语言使用某种引号绑定字符串,如下所示:

“Rob Malda很聪明。”

ANTLR 4可以将这样的字符串与如下lexer规则匹配:

QuotedString: '"' . *? '"';

要在字符串中使用某些字符,必须对其进行转义,可能如下所示:

“罗伯”塔科指挥官“马尔达很聪明。”

ANTLR 4也可以匹配此字符串;

转义字符串:'"'('\\"|.)*?'"';

(摘自最终ANTLR 4参考文献第96页)

我的问题是:假设用于转义的字符与字符串分隔符相同。例如:

“Rob”“Commander Taco”“Malda很聪明。”

(这在Powershell中完全合法。)

什么lexer规则会匹配这个?我认为这会起作用:

转义字符串:“”(“”)*?“”

但事实并非如此。lexer将转义字符标记为字符串分隔符的结尾。


共有2个答案

陆翔飞
2023-03-14

(不要投票支持这个答案;投票支持@Bart Kiers的答案。)

我提供这个是为了完整性,因为它是Powershell语法的一小部分。将权威ANTLR 4参考中p76的转义逻辑与Bart的答案相结合,以下是在Powershell中词典转义字符串所需的规则:

EscapedString
    : '"'      (Escape | '""'   | ~["])* '"'
    | '\''     (Escape | '\'\'' | ~['])* '\''
    | '\u201C' (Escape | .)*? ('\u201D' | '\u2033')   // smart quotes
    ;

fragment Escape
    : '\u0060\''    // backtick single-quote
    | '\u0060"'     // backtick double-quote
    ;

这些规则处理以下四种在Powershell中转义字符串的方法:

'Rob ''Commander Taco'' Malda is smart.'
"Rob ""Commander Taco"" Malda is smart."
'Rob `'Commander Taco`' Malda is smart.'
"Rob `"Commander Taco`" Malda is smart."
汲灿
2023-03-14

使用运算符对某些字符求反:

EscapedString : '"' ( '""' | ~["] )* '"';

或者,如果字符串中没有换行符,请执行以下操作:

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

您不想使用非贪婪运算符,否则"永远不会被消费,"a""b"将被标记为"a""b"而不是单个标记。

 类似资料:
  • 我的原始 sql:

  • 问题内容: 我想将包含转义字符的字符串转换为普通格式,就像Python的词法分析器所做的一样: 当然,无聊的方法是将所有已知的转义字符一一替换:http : //docs.python.org/reference/lexical_analysis.html#string- literals 您将如何在上述代码中实现? 问题答案: 几个类似的编解码器是可用的,如ROT13和十六进制。 上面是Pyth

  • 问题内容: 想知道是否有一种简单的方法可以在Objective C中执行简单的HTML转义/转义。我想要的是这样的伪代码: 哪个返回 希望也转义所有其他HTML实体,甚至ASCII码(例如Ӓ等)。 Cocoa Touch / UIKit中有什么方法可以做到这一点? 问题答案: 包含以下解决方案。可可CF具有CFXMLCreateStringByUnescapingEntities函数,但在iPho

  • 问题内容: 我正在编写一个Java程序来读取XML文件,实际上是一个iTunes库,它是XML plist格式。我设法解决了这种格式引发的大多数障碍,除非遇到包含的文本。XLM文件将“与”号表示为,并且我只能设法在文本的任何特定部分之后读取文本。 有没有办法禁用转义码检测?我正在使用SAXParser。 问题答案: 您尝试执行的操作有些混乱。 如果您尝试解析的文件格式包含“&” 字符,则它 不是

  • 问题内容: 我从服务器获取JSON数据,其中一个字段包含转义的html(实际上是电子邮件正文): (更多…) 我为尝试使用AngularJs渲染而疯狂。 以下内容不起作用: 我认为这是正常的,因为html实际上已经转义了。我应该先取消转义吗?Angular是否可以通过某些可用服务转义html? 如果我这样使用$ sce: 显示源html,检查元素可以看到引用的内容。换句话说,在页面中将显示源htm

  • 问题内容: 我正在尝试下面的代码,但出现错误 错误 我想要结果 问题答案: 请改用,它不使用正则表达式,因为您根本不需要它们: 这将按预期打印。