一个简单的语言的语法(三):做些小调整,并将生成目标换到CSharp2 - 编程入门网
一个简单的语言的语法(三):做些小调整,并将生成目标换到CSharp2时间:2011-10-07 javaeye RednaxelaFX为了后面的tree grammar更简洁,本篇对上一篇的树重写规则和一些语法细节做了些调整。并且,将 生成的lexer和parser的源码目标换到了CSharp2,以便后面能使用一些.NET的库。 要使用CSharp2的目标,需要从官网下载相应的运行时库。当前的最新版是3.1.1,可以从这里获取。 CSharp/CSharp2目标的详细情况,可以查阅官网上的文档。以上一篇的语法为基础,要换到CSharp2目标 只要把几个嵌入动作里的System.out.println换成Console.WriteLine,把toStringTree换成 ToStringTree,把clear换成Clear就可以了。编译的时候至少需要引用Antlr3.Runtime.dll。 那么除去更换生成目标带来的影响,这次做了些怎样的修改呢? 首先,语法做了些细微的调整。例如说,program规则从原本允许没有语句到现在要求至少有一条语句 ;blockStatement为空block写了条专门的分支;expressionStatement也添加了一个EXPR_STMT的虚构 token为根节点,等等。 变化最大的还是variableDeclaration及相关规则。上一篇里这条规则的重写规则并不区分有初始化与 无初始化、简单类型与数组类型的区别;本篇里则将这两个区别都明确的写在了重写规则里,以不同的虚 构token来作为生成的树的根节点。这样,到写后面的tree grammar的时候,需要的lookahead数就可以减 少。 ANTLR所生成的AST,以深度优先的方式遍历,可以看做一个一维的流:每一层父子关系都可以表示为 : root -> "down" -> element1 -> element2 -> ... -> elementN -> "up" -> ... 其中"down"和"up"是ANTLR插入的虚构token,用于指定树的层次。 这样,后面使用tree grammar来遍历AST时,实际上遍历的就是这样一个一维的流 (CommonTreeNodeStream)。所以我们也可以把tree grammar看做是隐含了"down"和"up"虚构token的普 通parser grammar。那么,tree grammar中需要的lookahead个数的分析,也就跟parser grammar的一样 。 看看下面的例子。对于上一篇variableDeclaration的重写规则中出现的变量声明的类型,可以用这样 的tree grammar来匹配: Java代码 type : ^( SIMPLE_TYPE INT ) | ^( SIMPLE_TYPE REAL ) | ^( ARRAY_TYPE INT Integer+ ) | ^( ARRAY_TYPE REAL Integer+ ) ; 树语法的^( ... )就隐含了"down"和"up"这两个虚构token。实际上这条规则匹配的是: 一个简单的语言的语法(三):做些小调整,并将生成目标换到CSharp2(2)时间:2011-10-07 javaeye RednaxelaFX可以很清楚的看到"down"和"up"在规则中的位置。 在进入这条规则之后,需要多少个lookahead才足以判断应该选择哪条分支呢? 向前看一位:只能排除掉两个分支,还有两个,不够; 向前看两位:第二位是什么呢?四个分支里第二位都是"down"节点,对判断分支没帮助,还是不够用 ; 向前看三位:SIMPLE和ARRAY、INT和REAL都能分开了,足够。 那么对这条规则而言,需要2个lookahead。阅读ANTLR生成的源码,可以看到input.LA(3)这样的调用 ,表示向前看第三位的token。每多一个lookahead,生成的代码就得多以层嵌套的if-else,很是麻烦。 如果能调整一下parser这边生成的AST的结构,让tree grammar那边能写成: Java代码 simpleType : INT | REAL ; arrayType : ^( INT Integer+ ) | ^( REAL Integer+ ) ; 那么这两条规则都只需要1个lookahead就足以判断分支了,比原本的写法要简单,也会稍微快一些。 写了个Ruby脚本来检查生成的源 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |