什么是lexer,什么是parser,lexer和parser之间的关系
1个回答
2016-02-08 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数: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前缀。
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前缀。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询