为了账号安全,请及时绑定邮箱和手机立即绑定

ANTLR中的解析器规则和词法分析器规则之间的实际区别?

ANTLR中的解析器规则和词法分析器规则之间的实际区别?

明月笑刀无情 2019-11-18 18:30:45
我了解理论上将解析器规则和词法分析器规则分开的理论,但是ANTLR中的这两个语句之间的实际区别是什么:my_rule: ... ;MY_RULE: ... ;它们会导致不同的AST树吗?不同的表现?潜在的歧义?
查看完整描述

2 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

仁写道:


...这两个语句在ANTLR中有什么实际区别...


MY_RULE将用于标记您的输入源。它代表了您语言的基本组成部分。


my_rule 从解析器中调用,它由零个或多个其他解析器规则或词法分析器生成的标记组成。


就是这样。


仁写道:


它们会导致不同的AST树吗?不同的表现?...


解析器使用词法分析器生成的令牌来构建AST,因此这些问题对我而言毫无意义。词法分析器仅向解析器“馈送”一维令牌流。


查看完整回答
反对 回复 2019-11-18
?
万千封印

TA贡献1891条经验 获得超3个赞

这篇文章可能会有所帮助:


词法分析器负责第一步,唯一的工作是从文本创建“令牌流”。它不负责理解您语言的语义,仅对理解您语言的语法感兴趣。


例如,语法是一个规则,即标识符必须仅使用字符,数字和下划线-只要它不以数字开头。词法分析器的职责是了解此规则。在这种情况下,词法分析器将接受字符“ asd_123”的序列,但拒绝字符“ 12dsadsa”(假设没有另一条规则适用于此文本)。当看到有效的文本示例时,它可能会向令牌流中发送令牌,例如IDENTIFIER(asd_123)。


请注意,我说的是“标识符”,是诸如变量名,函数名,名称空间名称等之类的通用术语。解析器将是能够理解该标识符出现的上下文的事物,以便其进一步指定该令牌作为某物的名称。


(旁注:令牌只是赋予令牌流元素的唯一名称。lexeme是匹配令牌的文本。我将lexeme写在令牌旁边的括号中。例如NUMBER(123)。在这种情况下,这是一个数字标记,其词素为'123'。但是,对于某些标记(例如运算符),我省略了词素,因为它是多余的。例如,我将为分号标记而不是SEMICOLON( ;))。



查看完整回答
反对 回复 2019-11-18
  • 2 回答
  • 0 关注
  • 689 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信