小编hen*_*yau的帖子

处理以ANTLR4中的转义引号结尾的字符串文字

如何编写词法分析器规则以匹配不以转义引用结尾的字符串文字?

这是我的语法:

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的解决方案都是很好的解决方案,不幸的是我只能接受一个.

antlr4

4
推荐指数
2
解决办法
4853
查看次数

ANTLR4中的无序子产品

我想在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

3
推荐指数
1
解决办法
123
查看次数

从ANTLR4解析器获取第一个并遵循元数据

是否可以使用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. …

antlr3 antlr4

2
推荐指数
1
解决办法
1347
查看次数

标签 统计

antlr4 ×3

antlr3 ×1