快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

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号