快速业务通道

一个简单的语言的语法(三):做些小调整,并将生成目标换到CSharp2 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14

一个简单的语言的语法(三):做些小调整,并将生成目标换到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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号