自定义一门语言——Quary

自定义一门语言——QuaryQuary 语言的定义是一个很有挑战性的过程 我模仿 C 和 python 成功定义了它 也许并不完备 随着实验的推进我会一一完善 定义语言的过程中 我对 BNF 语法有了新的了解和学习

大家好,欢迎来到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循环,用于计算110的整数和 # 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

(0)
上一篇 2024-11-23 10:45
下一篇 2024-11-23 11:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信