一个简单的语言的语法(一):用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
|