一个简单的语言的语法(一):用ANTLR描述语法 - 编程入门网
011-10-07 javaeye RednaxelaFX
2、int/real与逻辑/比较运算表达式的类型(boolean)是否有隐式转换的关系? 我这里假设是“有”。如果有的话,relationalExpression那里就能偷懒;不然可能得做点麻烦些的 处理…… 主要是关系到那个一元布尔否定运算符(''!''),C-like语言里它应该是跟一元算术求反运算符(''-'' )的优先级一样吧?在这个Jerry语言它的优先级里却比所有算术和比较运算符要低。 看像这样的Java代码: Java代码 public class Test { public static void main(String[] args) { if (! 1 != 1 || 1 == 1 ) { System.out.println("true"); } else { System.out.println("false"); } } } 编译的时候会有错误,因为!的优先级比!=高,而!不能作用在类型为int的1上; 但这样的Jerry代码: C代码 if (! 1 != 1 || 1 == 1 ) write 1; else write 0; 却应该能正确编译,且运行结果为1,因为!的优先级比!=低而比||高,所以1 != 1是false,它的反是 true;然后1 == 1是true,跟前面的true做或运算也还是true。 这语法比较的诡异…… 3、变量声明是否一定要一并出现在同一个作用域的其它语句的前面(就像C89那样)? 我这里假设是“否”。变量可以在任何能出现语句的地方出现。作用域从声明开始,到它的包围块结 束为止。 4、浮点数的字面量是否要求小数点前必须有至少一位数字?浮点数字面量是否允许或要求后缀修饰( 例如''r''或者''f''或者''d''之类)? 我的假设是浮点数只有一种字面量,满足这种形式:(用Perl兼容的正则表达式表示) Js代码 /\d+\.\d+/ 也就是小数点前后都必须有数字,而且没有后缀。 一个简单的语言的语法(一):用ANTLR描述语法(4)时间:2011-10-07 javaeye RednaxelaFX5、多维数组的语义是怎样的? 能否支持这样的声明和赋值: Java代码 int array2d[2][]; int array1d[10]; array2d[0] = array1d; 这个没办法假设……只能暂时认为数组声明的时候是多少维在访问的时候也必须用多少维来访问;这 样比较简单,哈哈。 6、数组声明的时候,是否允许用数组字面量来初始化? 我这里假设是“是”。 7、数组字面量是否允许空元素?同时,数组可否声明为零长度的? 我这里假设数组字面量不允许内容为空(跟C一样),数组也不可以声明为零长度的。 8、是否有强制类型转换的表达式?(根据原帖,赋值表达式有类型转换语义) 这里假设是“否”。有C-style的强制类型转换的话语法会麻烦不少…… 暂时就先这样吧。上面的语法里有经典的dangling-else问题;不过ANTLR默认是匹配优先,能自动消 除这个二义性,所以就没做特别的处理。 对这样的一段代码来测试: C代码 // line comment // declare variables with/without initializers int i = 1, j; int x = i + 2 * 3 - 4 / ( 6 - - 7 ); int array[2][3] = { { 0, 1, 2 }, { 3, 4, 6 } }; /* block comment */ while (i < 10) i = i + 1; while (!x > 0 && i < 10) { x = x - 1; if (i < 5) break; else read i; } write x - j; 可以生成这样的解析树(parse tree): 这个测试是通过ANTLRWorks的Interpreter模式来做的。编写本文的时候,最新版是1.2.2。可以在这 里获取。 观察此解析树: 输入进来的源码是一维的,而现在生成的解析树已经有了层次结构,变成二维的了。在得到层次结构 后,原本用来标识层次结构的标点符号就变得冗余了,但这棵解析树仍然含有这些冗余的标点符号。 另外,可以观察到解析树里的许多子树中每个节点都只有一个子节点;这 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |