是否可以使用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.
任何建议将不胜感激.
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).| 归档时间: |
|
| 查看次数: |
1347 次 |
| 最近记录: |