首页 / 软件开发 / JAVA / 一个简单的语言的语法(一):用ANTLR描述语法
一个简单的语言的语法(一):用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
106. | RealNumber
107. | LPAREN expression RPAREN
108. | SUB primaryExpression
109. ;
110.
111.relationalOperator
112. : LT | GT | EQEQ | LE | GE | NE
113. ;
114.
115.additiveOperator
116. : ADD | SUB
117. ;
118.
119.multiplicativeOperator
120. : MUL | DIV
121. ;
122.
123.// lexer rules
124.
125.LPAREN : "("
126. ;
127.
128.RPAREN : ")"
129. ;
130.
131.LBRACK : "["
132. ;
133.
134.RBRACK : "]"
135. ;
136.
137.LBRACE : "{"
138. ;
139.
140.RBRACE : "}"
141. ;
142.
143.COMMA : ","
144. ;
145.
146.SEMICOLON
147. : ";"
148. ;
149.
150.ADD : "+"
151. ;
152.
153.SUB : "-"
154. ;
155.
156.MUL : "*"
157. ;
158.
159.DIV : "/"
160. ;
161.
162.EQEQ : "=="
163. ;
164.
165.NE : "!="
166. ;
167.
168.LT : "<"
169. ;
170.
171.LE : "<="
172. ;
173.
174.GT : ">"
175. ;
176.
177.GE : ">="
178. ;
179.
180.BANG : "!"
181. ;
182.
183.ANDAND : "&&"
184. ;
185.
186.OROR : "||"
187. ;
188.
189.EQ : "="
190. ;
191.
192.IF : "if"
193. ;
194.
195.ELSE : "else"
196. ;
197.
198.WHILE : "while"
199. ;
200.
201.BREAK : "break"
202. ;
203.
204.READ : "read"
205. ;
206.
207.WRITE : "write"
208. ;
209.
210.INT : "int"
211. ;
212.
213.REAL : "real"
214. ;
215.
216.Identifier
217. : LetterOrUnderscore ( LetterOrUnderscore | Digit )*
218. ;
219.
220.Integer : Digit+
221. ;
222.
223.RealNumber
224. : Digit+ "." Digit+
225. ;
226.
227.fragment
228.Digit : "0".."9"
229. ;
230.
231.fragment
232.LetterOrUnderscore
233. : Letter | "_"
234. ;
235.
236.fragment
237.Letter : ( "a".."z" | "A".."Z" )
238. ;
239.
240.WS : ( " " | " " | "
" | "
" )+ { $channel = HIDDEN; }
241. ;
242.
243.Comment
244. : "/*" ( options { greedy = false; } : . )* "*/" { $channel = HIDDEN; }
245. ;
246.
247.LineComment
248. : "//" ~ ("
"|"
")* "
"? "
" { $channel = HIDDEN; }
249. ;