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

Antlr4 DM字符串lexer规则

钱远
2023-03-14
    null
    null

以下是我的(不完整和不成功的)尝试:

LSTRING: '"' ('\\[' | ~[[\r\n])* '[';
RSTRING: ']' ('\\"' | ~["\r\n])* '"'; 
CSTRING: ']' ('\\[' | ~[[\r\n])* '['; 
FSTRING: '"' ('\\"' | ~["\r\n])* '"';

如果不能在lexer中解决这个问题,我可以使用标记@{“”}[]\\自行编写解析器规则。

共有1个答案

曾明诚
2023-03-14

我用下面的lexer花絮解决了它。永久油墨

...
@lexer::members
{
ulong regularAccessLevel;
System.Collections.Generic.Stack<bool> multiString = new System.Collections.Generic.Stack<bool>();
}
...
VERBATIUM_STRING: '@"' (~["\r\n])* '"';
MULTILINE_VERBATIUM_STRING: '@{"' (~'"')* '"}';
MULTI_STRING_START: '{"' { multiString.Push(true); } -> pushMode(INTERPOLATION_STRING);
STRING_START: '"' { multiString.Push(false); } -> pushMode(INTERPOLATION_STRING);
...
LBRACE: '[' { ++regularAccessLevel; };
RBRACE: ']' { if(regularAccessLevel > 0) --regularAccessLevel; else if(multiString.Count > 0) { PopMode(); } };
...
mode INTERPOLATION_STRING;
CHAR_INSIDE: '\\\''
    | '\\"'
    | '\\['
    | '\\\\'
    | '\\0'
    | '\\a'
    | '\\b'
    | '\\f'
    | '\\n'
    | '\\r'
    | '\\t'
    | '\\v'
    ;

EMBED_START: '[' -> pushMode(DEFAULT_MODE);
MULTI_STRING_CLOSE: {multiString.Peek()}? '"}' { multiString.Pop(); PopMode(); };
STRING_CLOSE: {!multiString.Peek()}? '"' { multiString.Pop(); PopMode(); };
STRING_INSIDE: {!multiString.Peek()}? ~('[' | '\\' | '"' | '\r' | '\n')+;
MULTI_STRING_INSIDE: {multiString.Peek()}? ~('[' | '\\' | '"')+;

某些字符串可能导致它按顺序发出多个string_inside/multi_string_inside标记,但这是可以接受的,因为解析器无论如何都会吃掉所有标记。

其中很多来自于阅读antlr4示例permalink中的C#插值字符串

 类似资料:
  • 我正在为使用ANTLR4的某种语言开发一个小型IDE,当lexer无法匹配错误字符时,我需要在错误字符下划线。在这种情况下,内置的实现向stderr输出一条消息,类似于如下所示: 我完全可以理解如何获得关于错误的行和列的信息(作为参数传递给回调),但如何在回调中获得字符串? 当解析器是错误的来源时,它会将违规令牌作为回调的第二个参数传递,因此提取关于错误输入的开始和停止偏移量的信息变得很简单,参考

  • 从这个例子中,我需要将'some-text'和'more-text'匹配到一个lexer规则中的ANTLR4 lexer规则,并将'->'作为另一个规则。 我使用下面显示的lexer规则作为我的起点,但问题是NAMEDELEMENT规则中允许使用'-'字符,这会导致第一个NAMEDELEMENT匹配变成'some-text-',然后导致边缘规则无法捕获'->'。 我正在寻找一种方法来确保'-'不被

  • 我需要以下令牌: 允许的字符包括大写、小写、数字、空格和连字符 长度不固定(长度必须至少为两个字符) 标记必须至少包含一个空格或连字符 令牌必须以大写、小写、数字、空格或连字符开头和结尾(不能以空格开头或结尾) 下面语法中的ANTLR lexer规则“alphanumericspacehyphen”除了一个情况外几乎都起作用。使用解析器规则“sic”进行测试,以下输入将解析(不带引号): 以下输入

  • 本文向大家介绍python字符串分割及字符串的一些常规方法,包括了python字符串分割及字符串的一些常规方法的使用技巧和注意事项,需要的朋友参考一下 字符串分割,将一个字符串分裂成多个字符串组成的列表,可以理解为字符串转列表,经常会用到 语法:str.split(sep, [,max]),sep可以指定切割的符号,max可以指定切割的次数(次数不常用) 不带参数时以空格进行分割 带参数时,以该参

  • 我正在Antlr4和Python中创建一个解析器。下面是我在Antlr中创建的Lexer规则。 我正在研究STRINGCONST规则,并试图添加符号,例如和,但是,由于它们是转义字符,Antlr只是在为我抛出错误。我试着用自己的方式逃离他们,但我没能做到这一点。 有没有办法将它们包含在规则中?基本思想是我希望将字符串标识为两个标记之间的任何字符,但是我很乐意将其限制为规则中的当前内容,只要我也可以