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

hen*_*yau 2 antlr3 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.

任何建议将不胜感激.

Sam*_*ell 6

ANTLRWorks 2(AW2)执行类似的操作,我将在这里描述.如果您引用AW2的源代码,请记住它仅在LGPL许可下发布.

  1. 创建一个特殊标记,表示代码完成所需的位置.

    • 在某些方面,此令牌的行为类似于EOF.特别是,ParserATNSimulator 永远不会消耗这个标记; 总是在达到或达到之前做出决定.
    • 在其他方面,此令牌非常独特.特别是,如果令牌位于标识符或关键字处,则将其视为令牌类型为"模糊",并允许匹配该语言的任何标识符或关键字.对于ANTLR 4语法,如果插入符号位于用户键入的位置g,则解析器将允许该标记与规则名称或关键字匹配grammar.
  2. 创建一个专门的ATN解释器,它可以返回所有可能导致插入符号的解析树,而无需查看插入符号的任何决定,也不会限制插入符号的确切令牌类型.

  3. 对于每个可能的解析树,在解析器规则中匹配的插入符号的上下文中评估代码完成.

  4. 在步骤3中找到的所有结果的并集是完整的有效代码完成结果集的超集,并且可以在IDE中呈现.

以下描述了AW2对上述步骤的实现.

  1. 在AW2中,这是CaretToken,它始终具有令牌类型CARET_TOKEN_TYPE.
  2. 在AW2中,这个专门的操作由ForestParser<TParser>接口表示,其中大部分可重用的实现都AbstractForestParser<TParser>专门用于解析ANTLR 4语法以完成代码GrammarForestParser.
  3. 在AW2中,该分析主要由GrammarCompletionQuery.TaskImpl.runImpl(BaseDocument).