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

用嵌入式多行控制字符seuqences解析字符串

司徒云
2023-03-14
'some text'\1B 1B 1B\'some more text'.

控制字符序列以'\为前缀,以\\结尾。在控制序列中有两个数字,它们指定控制字符。

在上面的示例中,结果字符串为

'some textESCESCESCsome more text'

ESC代表不可打印的ASCII转义字符。

'some text'\1B 
1B 
1B\'some more text'.
grammar stringliteral;

tokens {
    CHAR,CHARS,CTRLCHARS,ESC,WHITESPACE,NEWLINE
}

stringLiteral:  '\'' CHARS? '\'' ;

fragment
CHARS: CHAR+ ;

fragment
CHAR: CTRLCHARS | ~['\n\r] ;

fragment
ESC: '\'\\' ;

fragment
CTRLCHARS: ESC ~['] ESC;

WHITESPACE: (' ' | '\t')+ -> channel(HIDDEN);

NEWLINE: ( '\r' '\n'? | '\n' ) -> channel(HIDDEN);
grammar stringliteral;

tokens {
     STRING
}

stringLiteral: STRING;
STRING: '\'' ( '\'' '\\' | '\\' '\'' | . )*? '\'';

输入'a string'\ctrl\''会产生错误

Line 1:10 token recognition error at: '\'
line 1:11 token recognition error at: 'C'
line 1:12 token recognition error at: 'T'
line 1:13 token recognition error at: 'R'
line 1:14 token recognition error at: 'L'
line 1:15 token recognition error at: '\'

你知道吗?顺便说一句:我们使用的是antlr V4.5。

共有1个答案

白博易
2023-03-14

这种语法存在多个问题:

  1. 不能在解析器规则中使用片段lexer规则。
  2. 您的字符串规则是解析器规则,因此它受制于您用空白换行规则定义的自动移除空白。
  3. 您没有规则来接受像\1b1b1b这样的控制字符序列。

特别是第三点是一个真正的问题,因为您不知道您的控制序列在哪里结束(除非这只是一个错别字,实际上您的意思是:\1b\1b\1b

STRING: '\' ('\\' '\'' | . )*? '\''; 
 类似资料:
  • 如果在antlr4 lexer中有一个ONELINE_STRING片段规则标识一行上的一个简单引号字符串,那么如何在lexer中创建一个更通用的字符串规则,该规则将相邻的ONELINE_STRING连接起来(即,只要它们都在不同的行上开始,仅用空格和/或注释分隔)? 即, 将被解析为两个字符串标记,“foo”后跟“bar” 同时: 示例1: Sample3(注意,'output'是该语言中的关键字

  • 问题内容: 我编写角度控制器的风格是这样的(使用控制器名称而不是函数) 我现在需要的是提供我要定义解析部分的路线时: 由于控制器定义为名称,如何解决以下问题? 为了更详细地阐明,我想在解析路由之前从服务器加载一些数据,然后在控制器中使用这些数据。 更新: 更准确地说,我希望每个模块都有其“解析”功能,该功能将在执行具有该控制器的root用户之前被调用。这篇文章中的解决方案(由MiskoHevery

  • 嗨,我的代码有一些问题,我需要接受一个3行的输入,并计算输入中“$”的数量。输入方法未注释为“scanf(”%[]s“,&userinput);”是唯一一个我发现采取所有3行输入,但我不能打破输入循环继续我的程序。 任何帮助都将不胜感激

  • Milo Yip 2016/9/27 本文是《从零开始的 JSON 库教程》的第三个单元解答编。解答代码位于 json-tutorial/tutorial03_answer。 1. 访问的单元测试 在编写单元测试时,我们故意先把值设为字符串,那么做可以测试设置其他类型时,有没有调用 lept_free() 去释放内存。 static void test_access_boolean() {

  • 问题内容: 我喜欢在python中如何执行以下操作: 基本上,它读取的是一行列表,其中每一个代表3D空间中的一个点,该点表示为三个数字,以逗号分隔 如何用C ++做到这一点而又不会太麻烦呢? 性能不是很重要,此解析仅发生一次,因此简单性更为重要。 PS我知道这听起来像是一个新手问题,但是相信我我已经用D语言编写了一个词法分析器(非常类似于C ),其中涉及逐个字符读取一些文本char并识别标记, 就

  • 问题内容: 如何从PHP字符串中删除STX等控制字符?我玩过 但发现它消除了很多麻烦。有没有办法 只 删除 控制字符? 问题答案: 如果用控制字符表示前32个ASCII字符和(包括回车等),那么它将起作用: (请注意单引号:双引号的使用会以某种方式导致解析错误。) 可以这样删除换行和回车符(通常写为和),以免删除: 更好地传达了代码的作用。 警告: PHP> = 5.3.0中已弃用,而PHP> =