LALR(1)语法自动分析生成器Mathew

2023-11-16

首次写博客,文采不好大家不要见笑额。

 

简介:

    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的同时生成的。用记事本就可以直接打开了。

如果你有足够的心思,可以利用它实现自己的一门计算机语言!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LALR(1)语法自动分析生成器Mathew 的相关文章

随机推荐

  • Linux 下的两个特殊的文件 -- /dev/null 和 /dev/zero 简介及对比

    1 概论 来自维基的解释 dev null 在类Unix系统中 dev null 或称空设备 是一个特殊的设备文件 它丢弃一切写入其中的数据 但报告写入操作成功 读取它则会立即得到一个EOF 在程序员行话 尤其是Unix行话中 dev nu
  • 链表类模板list

    描述 设计如下样式的链表类模板list 并对其进行简单使用 template
  • DataGridView数据显示和编辑控件的基本属性

    DataGridView是C Windows Forms中的一个数据显示和编辑控件 它具有许多有用的属性来控制其外观和行为 以下是DataGridView的一些基本属性 DataSource 设置或获取DataGridView绑定的数据源
  • clickhouse通过jdbc实现批量数据导入代码示例

    通过mybatis也可以实现批量写入clickhouse 但是效率太低 每秒大概只能写入300条数据 对于动辄上千万的数据或者更多数据 效率就太低了 而采用jdbc驱动的方式进行批量写入 每秒大约写入数据量达到10000条 效率得到大幅度的
  • 目标跟踪算法分类

    本文转载自 https www cnblogs com necp zwl p 6486326 html 上一篇文章写了 跟踪颜色块 自我感觉优化的空间很大 转载他人文章学习一下 运动目标跟踪主流算法大致分类 主要基于两种思路 a 不依赖于先
  • File类和Directory类

    File类和Directory类分别用来对文件和各种目录进行操作 这两类可以被实例化 但不能被其他类集成 1 File类 静态类 File类支持对文件的基本操作 它包括用于创建 复制 删除 移动和打开文件的静态方法 并协助创建FileStr
  • 渗透测试-完整渗透流程(一.信息收集)

    信息收集 1 信息收集分为主动收集和被动收集 主动收集会被防守方发现 被动收集不会被发现 主动信息收集 通过直接访问 扫描网站 这种流量将流经网站 被动信息收集 利用第三方的服务对目标进行访问了解 比例 Google搜索 Shodan搜索等
  • 设计模式(狂神说)

    1p 12p设计模式概述 代码 创建型模式 结构型模式 将类或者对象按照某种布局组成更大的结构 行为型模式 描述类和对象之间相互协作 2p 12p OOP七大原则 开闭原则 对扩展开放 对修改关闭 里氏替换原则 继承必须确保超类所拥有的性质
  • JVM常见知识点

    目录 JVM主要组成部分及其作用 JVM主要包含两个子系统和两个组件 Java程序运行机制 双亲委派机制 类加载器 双亲委派模型 双亲委派机制存在的意义 举例 栈 堆 队列 堆栈区别 队列跟栈区别 Java垃圾回收 方法区是在堆里面吗 JV
  • 国务院建议探索区块链等技术缩短承兑期限

    摘要 产业动态 全球大学区块链能力排名 新加坡国立大学第一 清华第八 韩国记者协会与与PUBLISH合作 采用区块链技术改善新闻媒体生态系统 Ripple与卡塔尔国家银行达成合作 将为其推出新汇款服务 政策相关 国务院 建议探索以互联网和区
  • B站S11破亿直播在线稳定性保障秘籍——演讲实录

    英雄联盟 S11全球总决赛 决赛中国战队夺冠 赛事直播盛况空前 观赛人数破亿 B站作为英雄联盟2021全球总决赛直播独家版权方不仅在整个比赛过程中保证了直播整体总体运行的平稳 还抗住了超预期的流量 如此大型的直播活动 B站究竟是如何保障系统
  • HarmonyOS UI组件在线预览,程序员直呼“不要太方便~”

    原文 UI组件在线预览 程序员直呼 不要太方便 点击链接查看更多技术内容 一 介绍 以往大家如果想查看组件的使用效果 需要打开DevEco Studio构建工程 现在为了便于大家高效开发 文档上线了JS UI组件在线预览功能 无需本地构建工
  • MySQL分库分表 看完吊打面试官

    MySQL分库分表 看完吊打面试官 前言 一 业务场景介绍 二 水平分库分表方法 1 RANGE 2 HASH取模 3 一致性HASH 三 单元测试 总结 作者寄语 提示 下方有源代码地址 请自行拿取 前言 在互联网项目中比较常用到的关系型
  • linux命令详解及软件安装(全)

    环境搭建 环境搭建 Vmware 账号管理 开机关机 目录管理 文件管理 文件操作 touch cat tac more less grep wc vim 磁盘管理 iostat sar df du 内存管理 free CPU管理 top
  • 2023华为OD机试真题Java实现【士兵过河/动态规划】

    题目内容 一支N个士兵的军队正在趁夜色逃亡 途中遇到一条湍急的大河 敌军在T的时长后到达河面 没到过对岸的士兵都会被消灭 现在军队只找到了1只小船 这船最多能同时坐上2个士兵 1 当1个士兵划船过河 用时为 a i 0 lt i lt N
  • 记录vue js-table2excel 导出带有多张图片到Excel

    新建js table2excel js文件 eslint disable let idTmr const getExplorer gt let explorer window navigator userAgent ie if explor
  • Springmvc拦截器三个方法的执行时机

    一 拦截器三个方法分别是 1 1 preHandle 预处理回调方法 实现处理器的预处理 如登录检查 第三个参数为响应的处理器 如具体的Controller实现 返回值 true表示继续流程 如调用下一个拦截器或处理器 false表示流程中
  • 微信小程序与应用服务的关系和“代码安全“

    今天给客户回答了下小程序项目的代码安全问题 他担心源代码提交以及发布系统后被第三方知晓源代码 导致代码泄露 虽然作为程序员来说 这个问题不用考虑 但是非技术人员似懂非懂 所以我还是做了一个解释 一般做微信小程序开发 需要知道微信小程序只是纯
  • 记录PaddleOcr的使用2 -- GPU

    项目场景 之前使用了cpu 但是效率感人 所以想尝试一下GPU的版本 安装环境 windows下使用的 别问 问就是没有有GPU的服务器 1 python 3 7 如果是linux建议3 8 2 pip 版本 20 2 2或更高版本 64
  • LALR(1)语法自动分析生成器Mathew

    首次写博客 文采不好大家不要见笑额 简介 Mathew 马修 马修名字源于 魔力女管家 里的星神马修 马修是一个LALR 1 型活动板房式的语法自动分析生成器 马修继承了Lemon 也许大家对LEX和YACC比较熟悉 这两个工具配合使用可以