什么是lexer,什么是parser,lexer和parser之间的关系

 我来答
huanglenzhi
2016-02-08 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517195
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
1.参考:
Lexical analysis
了解到。
输入:一堆字符,即我们写的语法代码,一个文件,也就是一堆字符;
经过lexer处理;
输出:一系列的token,相当于一堆的变量或者说符号;

lexer也被叫做:
lexical analyzer
scanner

2.后来参考:
【资料下载】ANTLR的最全的官方文档:The Definitive ANTLR Reference:v2,v3,v4版本都有下载
去找到了antlr v3的文档。
看其解释,更加深入了解到了一些内容:
(1)lexer和parser的语法是相同的,但是内部含义不同。
即,最好是自己真正搞懂内部,底层所涉及的含义如何。
即,写了个语法,要知道真正的含义。

(2)Lexer的rule,是以大写字母开头的。
比如:
?

1

ID : ('a'..'z' |'A'..'Z' |'_' ) ('a'..'z' |'A'..'Z' |'_' |'0'..'9' )* ;

所以,自己去antlrworks中,把之前的某个,小写字母开头的规则,从小写:

改为大写后,antlrworks中,果然就识别出不同效果,从parser变成lexer了:

3. 为了区别rule所生成的方法,antlr会给生成的id前加m。
比如,上面的ID所生成的方法叫做mID()

4.parser有起始符号,start symbol(类似于入口函数);
lexer没有start symbol。

5.lexer的语法,其实,就是一堆的符号定义(token definition)
每个token,都是,针对于输入的内容,全局性的,任何时刻都试用,都去匹配的。
内部机制:
antlr生成一个nextToken()的方法,其中就是个大的switch结构,将输入的内容,匹配到对应的类型的token后,即路由到某个lexer的rule,就去调用对应的rule去处理。

6.不论对于lexer还是parser,其中的大的rule,都最好拆分为小的rule。
目的:使得程序可读性增加,重用性增加。

7.antlr默认所有的token都是有效(valid)的。
如果你打算某个规则,只是起到帮助作用,即helper rule,那么就应该加上对应的fragment前缀。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式