如何编写词法分析器规则以匹配不以转义引用结尾的字符串文字?
这是我的语法:
lexer grammar StringLexer;
// from The Definitive ANTLR 4 Reference
STRING: '"' (ESC|.)*? '"';
fragment ESC : '\\"' | '\\\\' ;
Run Code Online (Sandbox Code Playgroud)
这是我的java块:
String s = "\"\\\""; // looks like "\"
StringLexer lexer = new StringLexer(new ANTLRInputStream(s));
Token t = lexer.nextToken();
if (t.getType() == StringLexer.STRING) {
System.out.println("Saw a String");
}
else {
System.out.println("Nope");
}
Run Code Online (Sandbox Code Playgroud)
这输出Saw a String.应该"\"真的匹配STRING吗?
编辑: 280Z28和Bart的解决方案都是很好的解决方案,不幸的是我只能接受一个.
我想在ANTLR中指定一个产品,其子产品的顺序无关紧要.请注意,我希望每个子制作都出现一次.实现这一目标的蛮力方式看起来像这样:
grammar Foo;
r : (A B) | (B A) ;
A : 'a' ;
B : 'b' ;
Run Code Online (Sandbox Code Playgroud)
随着更多的子制作被添加,排列的数量增加...... n!/(nk)!
grammar Foo2;
r : (A B C) | (A C B) | (B A C) | (B C A) | (C A B) | (C B A) ;
A : 'a' ;
B : 'b' ;
C : 'c' ;
Run Code Online (Sandbox Code Playgroud)
显然,上述解决方案并不实用.在ANTLR中是否有一个构造以更简洁的方式描述这样的排列?
是否可以使用ANTLR4从规则中提取第一组和后续组?我在ANTLR3中玩了一点这个并没有找到一个令人满意的解决方案,但如果有人知道任何一个版本的信息,我们将不胜感激.
我想解析用户输入用户的光标位置,然后提供自动完成的可能选择列表.目前,我对自动完成部分输入的令牌不感兴趣.我希望在解析的某个时刻显示所有可能的后续标记.
例如:
sentence:
subjects verb (adverb)? '.' ;
subjects:
firstSubject (otherSubjects)* ;
firstSubject:
'The' (adjective)? noun ;
otherSubjects:
'and the' (adjective)? noun;
adjective:
'small' | 'orange' ;
noun:
CAT | DOG ;
verb:
'slept' | 'ate' | 'walked' ;
adverb:
'quietly' | 'noisily' ;
CAT : 'cat';
DOG : 'dog';
Run Code Online (Sandbox Code Playgroud)
考虑到上面的语法......
如果用户还没有键入任何内容,则自动完成列表将是['The'](请注意,我必须检索FIRST而不是规则句子的FOLLOW,因为基本规则的跟随始终是EOF).
如果输入为"The",则自动完成列表将为['small','orange','cat','dog'].
如果输入是"猫睡了,自动完成列表将['安静','吵闹','.'].
所以ANTLR3提供了一种方法来获得以下这样的集合:
BitSet followSet = state.following[state._fsp];
Run Code Online (Sandbox Code Playgroud)
这很好用.我可以在我的解析器中嵌入一些逻辑,这样当解析器调用用户所在的规则时,它会检索该规则的以下内容,然后将它们提供给用户.但是,这对于嵌套规则也不起作用(例如,基本规则,因为跟随集忽略并且子规则如下所示).
我想如果用户已完成规则(这可能很难确定)以及覆盖所有有效选项的FOLLOW设置,我需要提供FIRST集.我还认为我需要构建我的语法,这样两个令牌永远不会在规则级别后续.
我会将上面的"firstSubject"规则划分为一些子规则......
从
firstSubject:
'The'(adjective)? CAT | DOG;
Run Code Online (Sandbox Code Playgroud)
至
firstSubject:
the (adjective)? CAT | DOG;
the:
'the';
Run Code Online (Sandbox Code Playgroud)
我还没有找到有关从规则中检索FIRST集的任何信息.
ANTLR4似乎已经在生成的解析器级别上大大改变了它的工作方式,所以此时我不确定是否应继续使用ANTLR3或跳转到ANTLR4. …