在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
LYRONLYRON是一个编译器框架程序,它能够允许用户定义编程语言,并且根据这种定义来解析对应的程序代码。 使用文档该使用文档面向的用户是定义特定编程语言的用户。对于这些用户来说,你只需要按照下面的方式定义你的语言,然后启动本程序解析你用来定义语言的文件,最后解析使用你定义的语言编写的程序代码。本程序最终会输出四元式。四元式是通用的源代码的中间表示,它包含了这个源代码的所有信息,你可以编写自己的后端处理四元式以生成特定平台的可执行程序。 PLDL语言语法:
一个典型的语言定义文件如下所示,该文法定义了一个支持加法和乘法的计算器怎样通过一个其对应的代码文件(一个算式)生成四元式: <pldl> <!--文法声明部分--> <cfgproductions> <item> <!--开始符号是Program--> <production>Program -> E</production> <movements> <!--必须先通过遍历其孩子节点获得属性--> <item>go($1)</item> </movements> <!--不生成任何四元式,所以不需要写generations--> </item> <item> <production>E -> E + T</production> <movements> <!--必须先通过遍历其两个孩子节点E和T获得属性--> <item>go($1)</item> <item>go($3)</item> <!--节点本身需要一个属性,值是一个新生成的临时变量--> <item>$$(val) = newTemp(val)</item> </movements> <!--所有子节点的四元式都生成完毕,再追加下面的四元式,所以用after-generations而不是before-generations--> <after-generations> <!--节点本身的val属性是之前的newTemp出的值--> <item>gen(add, $1(val), $3(val), $$(val))</item> </after-generations> </item> <item> <production>E -> T</production> <movements> <!--必须先通过遍历其孩子节点获得属性--> <item>go($1)</item> <!--将第一个子节点的val属性传递给节点本身--> <item>$$(val) = $1(val)</item> </movements> </item> <item> <production>T -> T * F</production> <movements> <!--必须先通过遍历其两个孩子节点获得属性--> <item>go($1)</item> <item>go($3)</item> <!--生成另一个临时变量,与上面不同--> <item>$$(val) = newTemp(val)</item> </movements> <!--所有子节点的四元式都生成完毕,再追加下面的四元式,所以用after-generations而不是before-generations--> <after-generations> <!--节点本身的val属性是之前的newTemp出的值--> <item>gen(multi, $1(val), $3(val), $$(val))</item> </after-generations> </item> <item> <production>T -> F</production> <movements> <item>go($1)</item> <item>$$(val) = $1(val)</item> </movements> </item> <item> <production>F -> num</production> <movements> <!--由于产生式右部没有非终结符,不需要写go语句--> <!--将第一个节点(终结符num)的词法值赋给节点本身--> <item>$$(val) = $1(val)</item> </movements> </item> </cfgproductions> <!--终结符词法部分--> <terminals> <!--除了num以外所有的终结符(*、+等)都是平凡的,因此只需要写num的正则表达式--> <item> <name>num</name> <!--终结符num的正则表达式--> <regex>[1-9][0-9]*|0</regex> </item> </terminals> <!--注释部分--> <comments> <item> <name>comment</name> <regex>/\*([^\*]|(\*)*[^\*/])*(\*)*\*/</regex> </item> </comments></pldl> 下面假设你已经定义了用于描述自己的语言的XML文件,请按照如下方式使用本程序。
以下是本程序根据上述示例中定义的语言解析代码 第一次运行: 欢迎使用LYRON!请选择程序执行方式1.输入xml文件,生成程序定义模型文件(model)2.输入model文件和对应的代码文件,生成四元式文件(4tu)1请输入xml文件路径test.xml请输入模型文件保存路径test.modelXML文件解析中...XML文件解析成功。正在构建词法分析器...词法分析器构建成功。正在构建语法分析器...表项共9*10项基于LR(1)分析的语法分析器构建成功。特定语言类型的内部编译器架构形成。保存模型中……保存模型成功 第二次运行: 欢迎使用LYRON!请选择程序执行方式1.输入xml文件,生成程序定义模型文件(model)2.输入model文件和对应的代码文件,生成四元式文件(4tu)2请输入模型文件路径test.model请输入代码文件路径test.code请输入四元式保存路径test.4tu正在读取代码文件...正在对代码进行词法分析...正在对代码进行语法分析构建分析树...正在对分析树进行语义赋值生成注释分析树...正在根据注释分析树生成四元式...生成四元式成功生成完毕。 生成的 multi, 4, 5, t_val0add, 3, t_val0, t_val1add, t_val1, 6, t_val2 开发文档该文档面向需要修改编译器框架本身的用户,这部分用户可以修改本工程代码,修复bug或提供不同功能的其他实现。例如,用户可以通过继承lexer.RE类实现自己的正则表达式引擎。
|
请发表评论