使用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';
鉴于以上语法...
如果用户尚未输入任何内容,则自动完成列表将为['The'](请注意,由于基本规则始终遵循EOF,因此我必须检索FIRST(而不是FOLLOW)规则语句。
如果输入为“ The”,则自动完成列表将为['small','orange','cat','dog']。
如果输入为“猫睡着了,则自动完成列表将为['安静地','嘈杂地','。']。
因此,ANTLR3提供了一种获取以下操作的方法:
BitSet followSet = state.following[state._fsp];
这很好。我可以在解析器中嵌入一些逻辑,以便当解析器调用用户所在的规则时,它会检索该规则的内容,然后将其提供给用户。但是,这不适用于嵌套规则(例如,基本规则,因为遵循集会忽略,而子规则则遵循它)。
我认为如果用户已完成一条规则(这可能很难确定),则需要提供FIRST集合,以及要覆盖所有有效选项的FOLLOW集合。我还认为我将需要构建语法,以使两个标记在规则级别永远不会出现。
我将上面的“ firstSubject”规则分解为一些子规则...
从
firstSubject:
'The'(adjective)? CAT | DOG;
至
firstSubject:
the (adjective)? CAT | DOG;
the:
'the';
我尚未找到有关从规则中检索FIRST集的任何信息。
ANTLR4似乎已经在生成的解析器级别彻底改变了其工作方式,因此在这一点上,我不确定我是否应该继续使用ANTLR3或跳转到ANTLR4。
任何建议将不胜感激。
ANTLRWorks 2(AW2)执行类似的操作,我将在这里进行描述。如果您引用AW2的源代码,请记住,它仅在LGPL许可下发布。
创建一个特殊的令牌,该令牌代表代码完成所关注的位置。
EOF
。特别是,ParserATNSimulator
从不使用此令牌;总是在做出决定之前或之前做出决定。g
,则解析器将允许该标记与规则名称或关键字匹配grammar
。创建一个专用的ATN解释程序,该解释程序可以返回导致插入符号的所有可能的分析树,而无需经过插入符号进行任何决策,也不会限制插入符号的确切令牌类型。
对于每个可能的解析树,请在解析器规则中匹配的所有插入符号之间评估您的代码完成情况。
在步骤3中找到的所有结果的并集是有效代码完成结果的完整集合的超集,并且可以在IDE中显示。
下面描述AW2的上述步骤的实现。
CaretToken
,并且始终具有令牌类型CARET_TOKEN_TYPE
。ForestParser<TParser>
接口表示,具有的大部分可重用实现,AbstractForestParser<TParser>
并且专用于解析ANTLR 4语法以在中完成代码GrammarForestParser
。GrammarCompletionQuery.TaskImpl.runImpl(BaseDocument)
。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句