一个简单的语言的语法(一):用ANTLR描述语法 - 编程入门网
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 : ( '' '' | ''\t'' | ''\r'' | ''\n'' )+ { $channel = HIDDEN; }
241. ;
242.
243.Comment
244. : ''/*'' ( options { greedy = false; } : . )* ''*/'' { $channel = HIDDEN; }
245. ;
246.
247.LineComment
248. : ''//'' ~ (''\n''|''\r'')* ''\r''? ''\n'' { $channel = HIDDEN; }
249. ;
一个简单的语言的语法(一):用ANTLR描述语法(2)时间:2011-10-07 javaeye RednaxelaFX基本上是怎么简单怎么写弄出来的语法而已。有些地方,例如下标表达式(index expression),是 可以显式写这么一条规则: Java代码 indexExpression : expression | indexExpression ''['' Integer '']'' ; 然后削除直接左递归: Java代码 indexExpression : expression ( ''['' Integer '']'' )* ; 然后看情况再消除间接左递归。 但在Jerry语言里,能使用下标的只有数组变量,那就干脆不定义单独的下标表达式,而直接把下标的 操作合并到variableAccess规则的数组变量分支里,也就是: Java代码 variableAccess : Identifier ( ''['' Integer '']'' )* ; 另外Jerry语言里的左值也只可能用变量访问来表示,所以也没有针对左值写特殊的规则(赋值表达式 和read语句都需要用到左值的概念),直接就用variableAccess了。 这语法只是大概猜的而已。有些细节在NeuronR的帖子里没有提到,所以语法或许与他的课程实践的要 求不完全一样。Anyway,我就先以这个理解为基础来平行做后续的实现了。 几个不太肯定的细节: 1、if和while语句的条件表达式的类型有没有要求? 我这里是不在语法上对表达式类型做限制,到后面的语义分析的时候再检查。 一个简单的语言的语法(一):用ANTLR描述语法(3)时间:2 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |