首次写博客,文采不好大家不要见笑额。
简介:
Mathew(马修),马修名字源于《魔力女管家》里的星神马修。马修是一个LALR(1)型活动板房式的语法自动分析生成器。马修继承了Lemon,也许大家对LEX和YACC比较熟悉。这两个工具配合使用可以轻松地构造出非常复杂的词法和语法分析程序。 Lemon类似于YACC,它是一个C或者C++语言的LALR(1)语法分析器生成器,其内部模板文件的思想成为了马修支持更多语言平台的启发。马修目前提供了c/c++, c#, java的语言模板文件。如果想使用其它语言,只需要拿其它语言模板文件(.tpl文件)依样画葫芦地修改一下就可以了,模板文件的思想避免了为适应相应相应平台的语言而去修改马修的源代码,也就是不需要重新编译马修。如果某些语言比较特殊需要修改源代码,可以在GitHub下载马修源代码。由于篇幅有限马修的特性在这里就交给了源代码内部的说明文档来向大家解释。
传送门: GitHub - AndoMahoro/Mathew: This is an LALR(1) parser Mathew
简易计算器的实现:
下面就利用一个简单的计算器的实现来简单的说明一下马修的用途。计算器程序是所有关于语法分析书籍里最喜欢提及的例子也就是相当于程序设计语言的第一课Hellow World!。
这里拿C#语言的计算器例子来演示一下:
1.首先在github下把C#这个文件夹下载下来。
打开后有如下几个文件
这里面最重要的就是gram.y语法文件和template.tpl(相应的语言平台的模板文件)。
template.tpl:
模板文件可以弹性修改为相应语言版本,模板文件的键值对采用了红黑树结构存储,所以上面%号的键值对之间的顺序还是可以打乱的。当然马修源码包目前就提供了三大编程语言的支持。我们平时要写的就是语法文件gram.y:
/* simple calculator */
%include{
using System.IO;
using System.Collections.Generic;
//#define DEBUG
}
%token_type <int>
%nonterminal_type <int>
%left PLUS MINUS.
%left DIVIDE TIMES.
%syntax_error{
Console.WriteLine("Syntax Error! \n By Shift " + @@ + " value(" + $$ + ")");
}
%parse_failed{
Console.WriteLine("Parse Failed!");
Environment.Exit(0);
}
program -> expr($A).{
Console.WriteLine("Result = " + $A);
}
expr($A) -> expr($B) PLUS expr($C).{
$A = $B + $C;
}
expr($A) -> expr($B) MINUS expr($C).{
$A = $B - $C;
}
expr($A) -> expr($B) TIMES expr($C).{
$A = $B * $C;
}
expr($A) -> expr($B) DIVIDE expr($C).{
if($C != 0)
$A = $B / $C;
else
Console.WriteLine("Divide by zero!");
}
expr($A) -> INTEGER($B).{$A = $B;}
%code{
public static void Main(string[] args)
{
Object pParser = ParseAlloc();
Parse(pParser,INTEGER,5);
Parse(pParser,PLUS,0);
Parse(pParser,INTEGER,6);
Parse(pParser,TIMES,0);
Parse(pParser,INTEGER,3);
Parse(pParser,0,0);
ParseFree(pParser);
Console.ReadKey();
}
}
然后点击上面那个ruan2.bat批处理文件运行并生成yy_table.cs。
不报错就表示成功了!
yy_table.cs就是我们想要的结果了。
将上述生成的代码直接复制粘贴覆盖掉控制台原来的代码就可以直接运行了,如果不想在控制台上实现可以修改语法文件或尝试修改一下模板文件让平台适应性更强。这个C#计算器例子很简单仅仅只是实现了加减乘除四则运算,上述代码实现了5+6*3 结果是输出23。
java平台
马修是一个很实用的工具,不仅可以生成语法分析程序,还可以选择性的生成状态转换表,编译原理课程上写出相应的产生式并以利用马修生成状态转换表来验证使用铅笔的推导。这个表在哪呢,就是上面给大家列出的gram.out文件,这个文件是生成yy_table.cs的同时生成的。用记事本就可以直接打开了。
如果你有足够的心思,可以利用它实现自己的一门计算机语言!