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

ANTLR字符串插值

融修平
2023-03-14

我正在尝试编写一个ANTLR语法,用于解析字符串插值表达式,例如:

my.greeting = "hello ${your.name}"

我得到的错误是:

line 1:31 token recognition error at: 'e'
line 1:34 no viable alternative at input '<EOF>'

MyParser。g4:

parser grammar MyParser;

options { tokenVocab=MyLexer; }

program: variable EQ expression EOF;
expression: (string | variable);
variable: (VAR DOT)? VAR;
string: (STRING_SEGMENT_END expression)* STRING_END;

MyLemus. g4:

lexer grammar MyLexer;

START_STR: '"' -> more, pushMode(STRING_MODE) ;
VAR: (UPPERCASE|LOWERCASE) ANY_CHAR*;
EQ: '=';
DOT: '.';

WHITE_SPACE: (SPACE | NEW_LINE | TAB)+ -> skip;

fragment DIGIT: '0'..'9';
fragment LOWERCASE: 'a'..'z';
fragment UPPERCASE: 'A'..'Z';
fragment ANY_CHAR: LOWERCASE | UPPERCASE | DIGIT;
fragment NEW_LINE: '\n' | '\r' | '\r\n';
fragment SPACE: ' ';
fragment TAB: '\t';

mode INTERPOLATION_MODE;

STRING_SEGMENT_START: '}' -> more, popMode;

mode STRING_MODE;

STRING_END: '"' -> popMode;
STRING_SEGMENT_END: '${' -> pushMode(INTERPOLATION_MODE);
TEXT : ~["$]+ -> more ;

像以下这样的表达式可以正常工作:

my.greeting = "hello"
my.greeting = "hello ${} world"

知道我做错了什么吗?

共有3个答案

陆飞捷
2023-03-14

字符串插值也在官方ANTLR语法库中现有的C#和PHP语法中实现。

陈季
2023-03-14

好的,我已经计算出(受此启发)我需要在INTERPOLATION_MODE中再次定义默认的lexer规则:

MyLemus. g4:

...
mode INTERPOLATION_MODE;

STRING_SEGMENT_START: '}' -> more, popMode;
I_VAR: (UPPERCASE|LOWERCASE) ANY_CHAR*;
I_DOT: '.';

...

MyParser。g4:

...
variable: ((VAR|I_VAR) (DOT|I_DOT))? (VAR|I_VAR);
...

不过,这似乎有些矫枉过正,所以仍然坚持要找一个有更好答案的人。

伍昱
2023-03-14

而不是:

mode INTERPOLATION_MODE;

STRING_SEGMENT_START: '}' -> more, popMode;
I_VAR: (UPPERCASE|LOWERCASE) ANY_CHAR*;
I_DOT: '.';

...

variable: ((VAR|I_VAR) (DOT|I_DOT))? (VAR|I_VAR);

您可以尝试:

mode INTERPOLATION_MODE;

STRING_SEGMENT_START: '}' -> more, popMode;
I_VAR: (UPPERCASE|LOWERCASE) ANY_CHAR* -> type(VAR);
I_DOT: '.' -> type(DOT);

...

variable: (VAR DOT)? VAR;
 类似资料:
  • 我将字符串作为解析器规则而不是词法分析器,因为字符串可能包含带有表达式的转义,例如。 这不起作用,因为

  • 我想要一个带有ANTLR的规则,将任何字符解析为数字、字符串特殊('@space)等,直到单词FOOTER(不包括) 我要解析的文本是这样的 我尝试使用此代码:在词法分析器中。 在解析器中。 但它不起作用。

  • 问题 你想创建一个字符串,让它包含体现某个 CoffeeScript 变量的文本。 解决方案 使用 CoffeeScript 中类似 Ruby 的字符串插值,而不是 JavaScript 的字符串拼接。 插值: muppet = "Beeker" favorite = "My favorite muppet is #{muppet}!" # => "My favorite muppet is B

  • 目前正在与ANTLR合作,发现了一些有趣的事情,但并没有按照我的预期工作。 我试着在我的语法中按照“test 10cm”的思路运行一些东西,但失败了,然而“test 10cm”的工作原理与前面的一样。代码的“cm”部分是我在语法中所说的“wholeunit”,如下所示: 它现在正在做的是规则中的“unitmod siunit”部分,其中unitmod=c和siunit=m。我想知道的是,我该怎么做

  • 在普通字符串中,我可以用反斜杠转义: 在字符串文字中有可能做同样的事情吗?反斜杠不再是转义字符: 到目前为止,我看到的唯一解决方案是字符串连接,这非常难看,以及嵌套插值,这开始变得有点可笑:

  • 问题内容: Java中的字符串构建使我感到困惑。我讨厌做这样的事情: 或者,使用StringBuilder,如下所示: 我肯定会丢失一些东西。有更好的方法。就像是: 代替: 做: 要么: 问题答案: 如果您使用的是Java 5或更高版本,则可以使用: 有关详细信息,请参见。