从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';

鉴于以上语法...

如果用户尚未输入任何内容,则自动完成列表将为['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许可下发布。

  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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ANTLR4解析器问题

来自分类Dev

antlr4解析器可以看到匹配的打开和关闭文本模式吗?

来自分类Dev

ANTLR4语法解析器问题

来自分类Dev

ANTLR4解析器规则粒度

来自分类Dev

ANTLR4解析器规则冲突

来自分类Dev

使用非唯一元键获取特定的WooCommerce订单项元数据

来自分类Dev

Antlr4如何创建一个解析器规则来检查类名和构造函数是否命名相同?

来自分类Dev

Antlr4定义一个运算符,该运算符可以是一元或二进制

来自分类Dev

Python ANTLR4示例-解析器似乎无法正确解析

来自分类Dev

Antlr4 解析器未正确解析重新分配语句

来自分类Dev

ANTLR4解析器规则以及其他解析器规则作为参数(元规则)

来自分类Dev

任何等效于“ not” scala解析器组合器的antlr4吗?

来自分类Dev

在Ltac中匹配一元数据构造函数

来自分类Dev

数据帧中非唯一元素的索引

来自分类Dev

在Ltac中匹配一元数据构造函数

来自分类Dev

无法使Antlr4解析器遵循隐式乘法的运算顺序

来自分类Dev

如何使自动生成的解析器类在ANTLR4中实现接口?

来自分类Dev

有没有办法为antlr4解析器提供ParseTree的包装?

来自分类Dev

无法使Antlr4解析器遵循隐式乘法的运算顺序

来自分类Dev

C#中的antlr4解析器---似乎正确,但不起作用

来自分类Dev

sql解析器上的antlr4不匹配输入错误

来自分类Dev

有没有办法为antlr4解析器提供ParseTree的包装?

来自分类Dev

ANTLR4 解析器生成:条件表达式的简单语法问题

来自分类Dev

ANTLR4 - 在解析器规则中使用隐藏令牌

来自分类Dev

如何获取R中数据帧的一列中唯一元素的频率?

来自分类Dev

如何使用自定义解析器作为PageTitleResolver,PageDescriptionResolver等添加自定义元数据

来自分类Dev

ANTLR 4解析器语法

来自分类Dev

使用ANTLR 4的配置解析器

来自分类Dev

Boost Spirit x3条件(三元)运算符解析器(后续问题)

Related 相关文章

  1. 1

    ANTLR4解析器问题

  2. 2

    antlr4解析器可以看到匹配的打开和关闭文本模式吗?

  3. 3

    ANTLR4语法解析器问题

  4. 4

    ANTLR4解析器规则粒度

  5. 5

    ANTLR4解析器规则冲突

  6. 6

    使用非唯一元键获取特定的WooCommerce订单项元数据

  7. 7

    Antlr4如何创建一个解析器规则来检查类名和构造函数是否命名相同?

  8. 8

    Antlr4定义一个运算符,该运算符可以是一元或二进制

  9. 9

    Python ANTLR4示例-解析器似乎无法正确解析

  10. 10

    Antlr4 解析器未正确解析重新分配语句

  11. 11

    ANTLR4解析器规则以及其他解析器规则作为参数(元规则)

  12. 12

    任何等效于“ not” scala解析器组合器的antlr4吗?

  13. 13

    在Ltac中匹配一元数据构造函数

  14. 14

    数据帧中非唯一元素的索引

  15. 15

    在Ltac中匹配一元数据构造函数

  16. 16

    无法使Antlr4解析器遵循隐式乘法的运算顺序

  17. 17

    如何使自动生成的解析器类在ANTLR4中实现接口?

  18. 18

    有没有办法为antlr4解析器提供ParseTree的包装?

  19. 19

    无法使Antlr4解析器遵循隐式乘法的运算顺序

  20. 20

    C#中的antlr4解析器---似乎正确,但不起作用

  21. 21

    sql解析器上的antlr4不匹配输入错误

  22. 22

    有没有办法为antlr4解析器提供ParseTree的包装?

  23. 23

    ANTLR4 解析器生成:条件表达式的简单语法问题

  24. 24

    ANTLR4 - 在解析器规则中使用隐藏令牌

  25. 25

    如何获取R中数据帧的一列中唯一元素的频率?

  26. 26

    如何使用自定义解析器作为PageTitleResolver,PageDescriptionResolver等添加自定义元数据

  27. 27

    ANTLR 4解析器语法

  28. 28

    使用ANTLR 4的配置解析器

  29. 29

    Boost Spirit x3条件(三元)运算符解析器(后续问题)

热门标签

归档