大家好,欢迎来到IT知识分享网。
Quary语言的定义是一个很有挑战性的过程,我模仿C—和python成功定义了它(也许并不完备,随着实验的推进我会一一完善),定义语言的过程中,我对BNF语法有了新的了解和学习。为什么定义这门语言?一开始,我的想法很简单,纯粹是觉得,仿照TINY,仿照C—太无聊了!为什么不自己定义一门语言呢?随着我对语言的深入理解,现在发现,这真的是一个很有挑战性的过程,在以后的语法分析,代码优化…过程中,将会遇到更多的挑战,继续加油吧!我的设想是,定义一门自己的语言Quary,创造出自己的编译器 QueryCompiler,然后将它部署到服务器上,做一个前后端项目,让每个人可以通过网络提交到Quary!继续加油!
下面我将会从
- 关键字定义
- 专用符号定义
- 标识符和数字
- 空字字符集
- 注释规则
- 语法和语义规则
这6个方面对Quary进行定义
(1)关键字
Quary语言中我定义了14个关键字,分别表示IF-ELSE分支,INT,CHAR类型,返回语句RETURN,VOID类型,循环WHILE和FOREACH,逻辑运算AND,OR,NOT,输入输出INPUT和PRINT,还有IN在foreach遍历时用到。
1./* reserved words 关键字*/ 2.IF,ELSE,INT,CHAR,RETURN,VOID,WHILE,FOREACH,AND,OR,NOT,INPUT,PRINT,IN,
(2)专用符号
专用符号表示非保留字,非NUM,ID的其他特殊字符,Quary语言中我定义了如下字符,他们的标识如下:
1.+ - * / < <= > >= == != = ; , ( ) [ ] {
} # 2.ADD,SUB,MUL,DIV, + - * / 3.LS,LE,MR,ME,EE,NE,ASSIGN, < <= > >= == != = 4.SEMI,COMMA, ; , 5.LPAREN,RPAREN () 6.LFPAREN,RFPAREN [] 7.LDPAREN,RDPAREN {
} 8.COMMENT,COLON # :
(3)标识符和数字
数字和标识是Quary中的特殊符号,分别被表示为NUM和ID,可以使用正则表达式来定义:
1.5.ID = letter letter* 2.6.NUM = digit digit* 3.7.letter = a|..|z|A|..|Z 4.8.digit = 0|..|9
(4)空字符集
空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开 I D、N U M关键字。
(5)注释规则
注释用#…#围起来。注释可以放在任何空白出现的位置 (即注释不能放在标记内)上,且可跨行,注释不能嵌套.
(6)语法和语意
关于语法和语义,我将仿照C-的定义给出Quary语言的BNF语法:
1.program→declaration-list 2.declaration-list→declaration-listdeclaration|declaration 3.declaration→var-declaration|fun-declaration
程序由声明的列表(或序列)组成,声明可以是函数或变量声明,顺序是任意的。至少必须有一个声明。接下来是语义限制(这些在C中不会出现)。所有的变量和函数在使用前必须声明(这避免了向后backpatching引用)。程序中最后的声明必须是一个函数声明,名字为main。注意,Quary缺乏原型,因此声明和定义之间没有区别
4.var-declaration→type-specifierID;|type-specifierID[NUM]; 5.type-specifier→int|char|void
变量声明或者声明了简单的整数类型int / 字符类型char变量,或者是基类型为整数/字符的数组变量,索引范围从0到 NUM-1。注意,在一个变量声明中,只能使用类型 指示符int/char。void用于函数声明(参见下面),也要注意,每个声明只能声明一个变量。
6.fun-declaration→type-specifierID(params)compound-stmt 7.params→param-list|void 8.param-list→param-list,param|param 9.param→type-specifierID|type-specifierID[]
函数声明由返回类型指示符、标识符以及在圆括号内的用逗号分开的参数列表组成,后面
跟着一个复合语句,是函数的代码。如果函数的返回类型是void,那么函数不返回任何值(即
是一个过程)。函数的参数可以是void(即没有参数),或者一列描述函数的参数。参数后面跟
着方括号是数组参数,其大小是可变的。简单的整型参数由值传递。数组参数由引用来传递
(也就是指针),在调用时必须通过数组变量来匹配。注意,类型“函数”没有参数。一个函数
参数的作用域等于函数声明的复合语句,函数的每次请求都有一个独立的参数集。函数可以是递归的(对于使用声明允许的范围)。
10.compound-stmt→:local-declarationsstatement-list end
11.local-declarations→local-declarationsvar-declaration|empty 12.statement-list→statement-liststatement|empty
注意声明和语句列表都可以是空的(非终结符empty表示空字符串,有时写作)
13.statement→expression-stmt 14.|compound-stmt 15.|selection-stmt 16.|iteration-stmt 17.|return-stmt 18.expression-stmt→expression;|;
19.selection-stmt→if(expression):statement 20.|if(expression)statement else statement 21.end
22.iteration-stmt→while(expression): 23.statement 24.end
25.iteration-stmt→forEach x in list: 26.statement 27.end
forEach语句是Quary中遍历列表数组的语句,它重复执行表达式,顺序遍历列表直到到达列表尾结束。
28.return-stmt→return;|return expression;
29.expression→var=expression|simple-expression 30.var→ID|ID[expression]
31.simple-expression→additive-expressionrelopadditive-expression|additive-expression 32.relop→<=|<|>|>=|==|!=
33.additive-expression→additive-expressionaddopterm|term 34.addop→+|- 35.term→termmulopfactor|factor 36.mulop→*|/
37.factor→(expression)|var|call|NUM
38.call→ID(args) 39.args→arg-list|empty 40.arg-list→arg-list,expression|expression
41.Int input(void){
...} 42.Void print(int x | int x[] |char x | char x[]){
...}
程序实例
- sample1.qy 测试样1, 他是一个简单的while循环,用于计算1到10的整数和
# 这是一段注释,将不会被识别 sample1.qy 测试样1, 他是一个简单的while循环,用于计算1到10的整数和 # int sum = 0 int i =1 while(i <= 10): # 当i<=10的时候,执行加法 # sum = sum + i i = i + 1 end print ( sum ) # output factorial of x #
- sample2.qy 测试样2, 他是一个简单的forEach循环,用于计算数组的乘积
# 这是一段注释,将不会被识别 sample2.qy 测试样2, 他是一个简单的forEach循环,用于计算数组的乘积 # int Arr[]=[1,2,3] # 一个数组结构 # int mul=1 forEach a in Arr: mul = mul*a end print(mul) # output factorial of x #
- sample3.qy 测试样3, 他执行一个简单的条件判断,根据输入的两个变量分别执行求和或者乘积
# 这是一段注释,将不会被识别 sample3.qy 测试样3, 他执行一个简单的条件判断,根据输入的两个变量分别执行求和或者乘积 # int Arr[]=[1,2,3] input(x) # 输入x,y # input(y) int sum=0 int mul=1 if (x>0 and y>0): # 求和 # forEach a in Arr: sum = sum+a end print(sum) else: forEach a in Arr: # 求积 # mul=mul*a end print(mul) end
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/131449.html