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 语法分析相关推荐

  1. java语法分析生成器,语法词法生成器

    一.语法词法生成器 Flex 语法扫描器生成器 flex (fast lexical analyser generator) 是Lex的另一个替代品.它经常和自由软件Bison语法分析器生成器 一起使 ...

  2. JavaCC首页、文档和下载 - 语法分析生成器 - 开源中国社区

    JavaCC首页.文档和下载 - 语法分析生成器 - 开源中国社区

  3. Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser

    一.Lucene的查询语法 Lucene所支持的查询语法可见http://lucene.apache.org/java/3_0_1/queryparsersyntax.html (1) 语法关键字 + ...

  4. javacc编译原理实训报告

    一.综合训练目的与要求 本综合训练是软件工程专业重要的实践性环节之一,是在学生学习完<编译原理>课程后进行的综合练习. 本课综合训练的目的: 巩固和加深学生对编译原理课程基本知识的理解和掌 ...

  5. Java制导软件_GitHub - yaoceyi/JavaCC: JavaCC实现简易编译器

    JavaCC Mnc-javacc 简单语法器 功能要求 用流的形式读入要分析的MiniC源程序. 能够根据单词的构词规则,完成MiniC语言中的单词的解析(词法分析),如果不符合单词的构词规则,请给 ...

  6. 小型桌面计算器的实现(javacc)

    从开始学计算理论,就对形式语言,编译原理很感兴趣,所以大学对这门课学的也算是最好了.自己也实现过一些简单的词法分析器之类的东西,不过也都是学习目的的,质量一般 后来一直在Linux学习,对lex/ya ...

  7. JAVACC 入门(转载)

    JAVACC 入门(转载) JavaFlashIDEA算法Unix  读了JavaCC自带文档中的SimpleExamples之后,有一点心得,于是总结一下,以备遗忘. JavaCC的输入文档是一个词 ...

  8. 编译原理与javacc初探

    1.前序 真是书到用时方恨少啊,在大学的时候,虽然学过编译原理,但当时真是不懂啊,只是为了应付考试,死记硬背了一点点.现在呢,由于工作上的需要,不得不弥补一下啊. 这两天把编译原理的书又看了一遍,其实 ...

  9. java语言生成语法分析_语法分析器自动生成工具一览

    最近打算重做以前的一个留下遗憾的工作,当中的一项小任务就是要求编写一个简易SQL语言的语法分析器. 本科的<编译原理>课程依稀在我脑中留下些许映象.当初的课程大作业是写一个叫Dicuf(貌 ...

  10. LLVM与Clang局部架构与语法分析

    LLVM与Clang局部架构与语法分析 Clang与LLVM LLVM整体架构,前端用的是clang,广义的LLVM是指整个LLVM架构,一般狭义的LLVM指的是LLVM后端(包含代码优化和目标代码生 ...

最新文章

  1. SHELL脚本取系统当前年月日问题 (去0)
  2. 【计算理论】可判定性 ( 对角线方法 | 使用对角线方法证明 通用任务图灵机 语言 不可判定 )
  3. 类和对象—对象特性—深拷贝与浅拷贝
  4. 成功解决 OSError: [WinError 193] %1 不是有效的 Win32 应用程序
  5. 算法导论吃透后的水平_初学算法,你应该这么玩
  6. Libra教程之:数据结构和存储
  7. 用Docker构建LNMP环境(上)
  8. Pygame 整活五子棋
  9. ZZULIOJ 1057:素数判定
  10. [C#-Util]ObjectPool Prototype
  11. Windows 7安装Oracle 10g的方法
  12. IGMP协议——IP组播之组管理协议
  13. 中国民间秘术大揭露【实用】
  14. Delay-Doppler equalization(8)(时延多普勒均衡)⭐
  15. Python 源程序的基本概念
  16. FPGA实现360°SG90舵机
  17. 反向代理为何叫反向代理?(含案例)
  18. 英语语法 第一章 句子的形成——概说
  19. Azure:云平台概述
  20. 计算机技术培训新闻,二附院举办ERAS下人工智能计算机辅助关节置换技术

热门文章

  1. cad快速选择命令快捷键_CAD快捷键,命令大全
  2. 十分好用PDF转换成PPT转换器
  3. 如何1分钟制作自己的软件
  4. C++ gflags
  5. 常用环境测试项目及标准
  6. uniapp 修改tabBar图标大小和navigationBar字体大小
  7. 发两本经典的C/C++教材电子版
  8. 自动定量包装机机械及控制系统设计(PLC控制)
  9. Spring AOP实现原理简介
  10. esxi安装系统ndows,ESXI 安装 Windows Server 2012过程