快速业务通道

一个简单的语言的语法(一):用ANTLR描述语法 - 编程入门网

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

一个简单的语言的语法(一):用ANTLR描述语法

时间:2011-10-07 javaeye RednaxelaFX

在JavaEye的博客频道逛,看到NeuronR的blog上有关于他的编译器实践的帖子,觉得有点意思,于是 平行的用别的方法来做那个编译器。那边要求是用C来实现,我这边就用些方便些的语言来实现吧。

本篇将通过ANTLR 3.1描述Jerry语言,并在ANTLRWorks里实验,通过生成的解析器来得到Jerry程序代 码对应的解析树。

关注过解析器生成器的话,ANTLR应该不会是个陌生的名字才对。Anyway简短说几句。ANTLR在生成解 析器方面正得到越来越多的应用,几个实例,XRuby项目用了,Jython现在正在使用,SapphireSteel的 Ruby和ActionScript IDE也用ANTLR来生成编译器前端。

ANTLR,ANother Tool for Language Recognition,是由Terence Parr教授开发的语言工具,用于协 助生成解析器、编译器、解释器等与语言处理相关的程序。它由PCCTS发展而来,特征是可以生成采用LL (*)算法的递归下降式的解析器。它所使用的语法表述格式类似于常见的EBNF(extended Backus–Naur form),易于理解和维护。

读了编译器构造实践[任务布置]之后,大概琢磨着语法应该是像这样的吧:

Jerry.g:(ANTLR 3.1语法)

Java代码

1.grammar Jerry; 2. 3.program : statementList EOF 4. ; 5. 6.statementList 7. : statement* 8. ; 9. 10.statement 11. : expressionStatement 12. | variableDeclaration 13. | blockStatement 14. | ifStatement 15. | whileStatement 16. | breakStatement 17. | readStatement 18. | writeStatement 19. ; 20. 21.expressionStatement 22. : expression SEMICOLON 23. ; 24. 25.variableDeclaration 26. : typeSpecifier Identifier ( LBRACK Integer RBRACK )* initializer? 27. ( COMMA Identifier ( LBRACK Integer RBRACK )* initializer? )* 28. SEMICOLON 29. ; 30. 31.typeSpecifier 32. : INT | REAL 33. ; 34. 35.initializer 36. : EQ ( expression | arrayLiteral ) 37. ; 38. 39.arrayLiteral 40. : LBRACE 41. ( expression | arrayLiteral ) ( COMMA ( expression | arrayLiteral ) )* 42. RBRACE 43. ; 44. 45.blockStatement 46. : LBRACE statementList RBRACE 47. ; 48. 49.ifStatement 50. : IF LPAREN expression RPAREN statement ( ELSE statement )? 51. ; 52. 53.whileStatement 54. : WHILE LPAREN expression RPAREN statement 55. ; 56. 57.breakStatement 58. : BREAK SEMICOLON 59. ; 60. 61.readStatement 62. : READ variableAccess SEMICOLON 63. ; 64. 65.writeStatement 66. : WRITE expression SEMICOLON 67. ; 68. 69.variableAccess 70. : Identifier ( LBRACK Integer RBRACK )* 71. ; 72. 73.expression 74. : assignmentExpression 75. | logicalOrExpression 76. ; 77. 78.assignmentExpression 79. : variableAccess EQ expression 80. ; 81. 82.logicalOrExpression 83. : logicalAndExpression ( OROR logicalAndExpression )* 84. ; 85. 86.logicalAndExpression 87. : relationalExpression ( ANDAND relationalExpression )* 88. ; 89. 90.relationalExpression 91. : additiveExpression ( relationalOperator additiveExpression )? 92. | BANG relationalExpression 93. ; 94. 95.additiveExpression 96. : multiplicativeExpression ( additiveOperator multiplicativeExpression )* 97. ; 98. 99.multiplicativeExpression 100. : primaryExpression ( multiplicativeOperator primaryExpression )* 101. ; 102. 103.primaryExpression 104. : variableAccess 105. | Integer

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号