javacc 语法分析
javacc 语法分析
在词法分析的基础上使用给出的MiniC语法为参考文法编写语法分析器。
MiniC语法如下:
<程序> ->Type main(){<语句块>*}
<语句块> -> <语句>|{<语句块>*}
<语句> -> <顺序语句>|<条件语句>|<循环语句>
<顺序语句> ->(<声明语句>|<赋值语句>)”;”
<声明语句> ->Type ID,ID,…,ID
<赋值语句> ->ID =<表达式>
<条件语句> ->if(<条件>)<语句块>else<语句块>
<循环语句> ->while(<条件>)<语句块>
<逻辑> -><条件>(<逻辑运算符><条件>)*
<条件> -><表达式>(<关系符><表达式>)?
<表达式> ->//可以使用默认的
<关系符> -><|<=|>|>=|==|!=
<逻辑运算> ->&& | || (包含在逻辑中)
要求如下:以文件流的形式读入要分析的C语言程序;如果输入的源程序符合MiniC的语法规范,输出语法树到文件中。
程序的输入需要从文件中读取,并且我们需要修改SimpleNode.java文件中的dump方法来使得输出语法树到指定文件中。
SimpleNode.java文件中的dump方法修改部分如下:
public void dump(String prefix) {try {File file = new File("./text2.txt");FileOutputStream out = new FileOutputStream(file,true);byte [] array = (toString(prefix)+"\n").getBytes();out.write(array);out.close();if (children != null) {for (int i = 0; i < children.length; ++i) {SimpleNode n = (SimpleNode)children[i];if (n != null) {n.dump(prefix + " ");}}}}catch(Exception e) {e.printStackTrace();}
.jjt文件中Main方法修改为:
import java.io.FileInputStream;import java.io.FileReader;import java.io.FileNotFoundException;public class MyNewGrammar{public static void main(String args [])throws FileNotFoundException{System.out.println("语法分析Reading from standard input...");FileReader fr = new FileReader("./workform.txt");MyNewGrammar parser = new MyNewGrammar(fr);try{SimpleNode n = parser.Start();n.dump("");System.out.println("END");}catch (Exception e){System.out.println("Oops.");System.out.println(e.getMessage());}}}
.jjt文件中添加实现的语法规则如下:
SimpleNode Start() :{}{Program(){return jjtThis;}}void Program() :{}{Type()< MAIN >< LB >< RB >< BLB >(SentenceBlock())*(ReturnSentence())< BRB >}void Type() :{}{< INT >| < VOID >| < STRING >| < CHAR >| < DOUBLE >| < FLOAT >}void ReturnSentence():{}{< RETURN > <INTEGER_LITERAL> < SEMICOLON>}void SentenceBlock() :{}{Sentence()| < BLB > (SentenceBlock())* < BRB >}void Sentence() :{}{SequenceSentence()| ConditionSentence()| LoopSentence()}void SequenceSentence() :{}{StateSentence() < SEMICOLON >| AssignSentence() < SEMICOLON >}void StateSentence() :{}{Type()Identifier() (< COMMA > Identifier())*}void AssignSentence() :{}{Identifier()< EQ >Expression()}void ConditionSentence():{}{< IF >Condition()SentenceBlock()}void Condition() :{}{< LB >Expression()Relations()Expression()< RB >}void Relations():{}{< GD >| < LD >| < EQ >}void LoopSentence():{}{< WHILE >Condition()SentenceBlock()}
测试代码如下:
void main(){while(a>45){int x, x1;x=x1+1;}return 0;}
结果如下:
javacc 语法分析相关推荐
- java语法分析生成器,语法词法生成器
一.语法词法生成器 Flex 语法扫描器生成器 flex (fast lexical analyser generator) 是Lex的另一个替代品.它经常和自由软件Bison语法分析器生成器 一起使 ...
- JavaCC首页、文档和下载 - 语法分析生成器 - 开源中国社区
JavaCC首页.文档和下载 - 语法分析生成器 - 开源中国社区
- Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser
一.Lucene的查询语法 Lucene所支持的查询语法可见http://lucene.apache.org/java/3_0_1/queryparsersyntax.html (1) 语法关键字 + ...
- javacc编译原理实训报告
一.综合训练目的与要求 本综合训练是软件工程专业重要的实践性环节之一,是在学生学习完<编译原理>课程后进行的综合练习. 本课综合训练的目的: 巩固和加深学生对编译原理课程基本知识的理解和掌 ...
- Java制导软件_GitHub - yaoceyi/JavaCC: JavaCC实现简易编译器
JavaCC Mnc-javacc 简单语法器 功能要求 用流的形式读入要分析的MiniC源程序. 能够根据单词的构词规则,完成MiniC语言中的单词的解析(词法分析),如果不符合单词的构词规则,请给 ...
- 小型桌面计算器的实现(javacc)
从开始学计算理论,就对形式语言,编译原理很感兴趣,所以大学对这门课学的也算是最好了.自己也实现过一些简单的词法分析器之类的东西,不过也都是学习目的的,质量一般 后来一直在Linux学习,对lex/ya ...
- JAVACC 入门(转载)
JAVACC 入门(转载) JavaFlashIDEA算法Unix 读了JavaCC自带文档中的SimpleExamples之后,有一点心得,于是总结一下,以备遗忘. JavaCC的输入文档是一个词 ...
- 编译原理与javacc初探
1.前序 真是书到用时方恨少啊,在大学的时候,虽然学过编译原理,但当时真是不懂啊,只是为了应付考试,死记硬背了一点点.现在呢,由于工作上的需要,不得不弥补一下啊. 这两天把编译原理的书又看了一遍,其实 ...
- java语言生成语法分析_语法分析器自动生成工具一览
最近打算重做以前的一个留下遗憾的工作,当中的一项小任务就是要求编写一个简易SQL语言的语法分析器. 本科的<编译原理>课程依稀在我脑中留下些许映象.当初的课程大作业是写一个叫Dicuf(貌 ...
- LLVM与Clang局部架构与语法分析
LLVM与Clang局部架构与语法分析 Clang与LLVM LLVM整体架构,前端用的是clang,广义的LLVM是指整个LLVM架构,一般狭义的LLVM指的是LLVM后端(包含代码优化和目标代码生 ...
最新文章
- SHELL脚本取系统当前年月日问题 (去0)
- 【计算理论】可判定性 ( 对角线方法 | 使用对角线方法证明 通用任务图灵机 语言 不可判定 )
- 类和对象—对象特性—深拷贝与浅拷贝
- 成功解决 OSError: [WinError 193] %1 不是有效的 Win32 应用程序
- 算法导论吃透后的水平_初学算法,你应该这么玩
- Libra教程之:数据结构和存储
- 用Docker构建LNMP环境(上)
- Pygame 整活五子棋
- ZZULIOJ 1057:素数判定
- [C#-Util]ObjectPool Prototype
- Windows 7安装Oracle 10g的方法
- IGMP协议——IP组播之组管理协议
- 中国民间秘术大揭露【实用】
- Delay-Doppler equalization(8)(时延多普勒均衡)⭐
- Python 源程序的基本概念
- FPGA实现360°SG90舵机
- 反向代理为何叫反向代理?(含案例)
- 英语语法 第一章 句子的形成——概说
- Azure:云平台概述
- 计算机技术培训新闻,二附院举办ERAS下人工智能计算机辅助关节置换技术