我正在尝试编写一个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"
知道我做错了什么吗?
字符串插值也在官方ANTLR语法库中现有的C#和PHP语法中实现。
好的,我已经计算出(受此启发)我需要在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);
...
不过,这似乎有些矫枉过正,所以仍然坚持要找一个有更好答案的人。
而不是:
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或更高版本,则可以使用: 有关详细信息,请参见。