编译原理实验:java实现语法分析器

实验方法:递归下降分析法基本思想是,对文法中的每个非终结符编写一个函数,每个函数的功能是识别由该非终结符所表示的语法成分。因此需要分别构造 E,E’,T,T’,F 函数来执行自己的识别功能,根据文法的内容顺序决定函数的识别功能。

java程序实现:

import java.util.Scanner;

public class GrammarAnalysis {

static char[] s = new char[100];

static int sing;

static int i; //用来记录数组s中的下标;

static int n;//装语句中的自变量;

static void P() {

if(sing==0) {

if(s[i]==‘b‘) {

++i;

S();

if(s[i]==‘e‘) {

++i;

}else{

sing=1;

System.out.println("error!--------不是结尾符号e");

System.exit(-1);

}

}else {

sing=1;

System.out.println("error!--------缺少开头符号b");

System.exit(-1);

}

}

}

static void S() {

if(sing==0) {

A();

if(s[i]==‘;‘) {

++i;

// if(s[i]!=‘e‘) {

S1();

// }

}else {

sing=1;

System.out.println("error!-----------缺少结尾符号;");

System.exit(-1);

}

}

}

static void S1() {

if(sing==0) {

if(s[i]!=‘e‘) {

// ++i;

S();

}

}

}

static void A() {

if(sing==0){

if(s[i+1]==‘=‘) {

n=s[i];

++i;

++i;

E();

if(s[i]==‘)‘||s[i]==‘;‘) {

if(s[i]==‘)‘) {

++i;

}

}else {

sing=1;

System.out.println("error!--------不是结尾符号;或者)");

System.exit(-1);

}

}else {

sing=1;

System.out.println("error!---------不是赋值语句");

}

}

}

static void E() {

if(sing==0){

T();

if(s[i]==‘+‘||s[i]==‘-‘||s[i]==‘;‘||s[i]==‘)‘) {

E1();

}else {

sing=1;

System.out.println("error!-----------不是结尾符号+或者-或者;或者)");

System.exit(-1);

}

}

}

static void T() {

if(sing==0){

F();

if(s[i]==‘+‘||s[i]==‘-‘||s[i]==‘;‘||s[i]==‘)‘||s[i]==‘*‘||s[i]==‘/‘) {

T1();

}

}

}

static void F() {

if(sing==0){

if(s[i]==‘(‘) {

++i;

E();

}else {

n=s[i];

++i;

}

}

}

static void T1() {

if(sing==0){

if(s[i]==‘*‘) {

++i;

F();

T1();

}else if(s[i]==‘/‘){

++i;

F();

T1();

}

}

}

static void E1() {

if(sing==0){

if(s[i]==‘+‘) {

++i;

T();

E1();

}else if(s[i]==‘-‘){

++i;

T();

E1();

}

}

}

public static void main(String[] args) {

Scanner sc=new Scanner(System.in);

System.out.println("请输入语句段:");

String str=sc.next();

s=str.toCharArray();

i=0;

sing=0;

if(s[0]==‘#‘) System.exit(-1);

P();

if(s[i]==‘#‘) {

System.out.println("success!");

}else {

System.out.println("error!-------不是结尾符号#");

System.exit(-1);

}

}

}

//测试:bi=i+i*(i/i-i);i=i+i;e#

//测试:i=i+i*ie #

运行结果测试:

不太规范的语法树:(主要用来自己分析逻辑走向~)

原文地址:https://www.cnblogs.com/Calor/p/11651489.html

时间: 2024-07-30 19:30:09

编译原理实验:java实现语法分析器的相关文章

哈工大软件学院编译原理实验1——词法分析

这次实验被"过来人"们定位非常easy,实验内容例如以下: ----------------------------------------------------------------------------------- 对例如以下工作进行展开描写叙述 (1) 给出语言的词法规则描写叙述 · 标识符.keyword.整常数.字符常数.浮点常数 · 单界符:+,-,×,;,- · 双界符:/*,:=,>=,<=,!=,- · 凝视 (2) 针对这样的单词的状态转换图和程

编译原理实验代码(词法分析,语法分析,中间代码生成)

花了一天写出的程序没有顾及很多层面,但对于理解基本的实验道理和交上实验还是有点帮助的.代码实现了基于有限自动机的词法分析,采用递归下降分析法和EBNF文法实现语法分析并生成中间代码. lexAnalysis.h /* * lexAnalysis.h * * Created on: 2014-12-2 * Author: liuqiushan */ #ifndef LEXANALYSIS_H_ #define LEXANALYSIS_H_ #include <stdio.h> #include

编译原理 - 实验三 - 递归下降语法分析器的调试及扩展

一. 语法分析介绍 语法分析是编译过程的核心部分,它的主要任务是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备.执行语法分析任务的程序叫语法分析程序或语法分析器. 二. 所实现的语义分析和代码生成程序能处理什么语句 (1)简单变量的声明语句 (2)表达式语句 (3)if语句. (4)while语句 (5)for语句 (6)write语句 (7)read语句 (8)do语句. (9)处理过程调用和返回 三.实验过程 ①用VC

编译原理实验二:LL(1)语法分析器

一.实验要求 不得不想吐槽一下编译原理的实验代码量实在是太大了,是编译原理撑起了我大学四年的代码量... 这次实验比上次要复杂得多,涵盖的功能也更多了,我觉得这次实验主要的难点有两个(其实都是难点...): 1. 提取左公因子或消除左递归(实现了消除左递归) 2. 递归求First集和Follow集 其它的只要按照课本上的步骤顺序写下来就好(但是代码量超多...),下面我贴出实验的一些关键代码和算法思想. 二.基于预测分析表法的语法分析 2.1 代码结构 2.1.1  Grammar类    功

吉首大学_编译原理实验题_基于预測方法的语法分析程序的设计【通过代码】

一.实验要求 实验二 基于预測方法的语法分析程序的设计 一.实验目的 了解预測分析器的基本构成及用自顶向下的预測法对表达式进行语法分析的方法,掌握预測语法分析程序的手工构造方法. 二.实验内容 1.了解编译程序的基于预測方法的语法分析过程. 2.依据预測分析原理设计一个基于预測方法的语法分析程序. 三.实验要求 对给定文法G[S]: S->AT       A->BU     T->+AT|$      U->*BU|$    B->(S)|m 当中,$表示空串. 1.推断上

编译原理 实验3 语法分析

语法分析 一. 实验目的 算术表达式的文法可以是(你可以根据需要适当改变): E→E+E|E-E|E*E|E/E|(E)|i 根据算符优先分析法,将表达式进行语法分析,判断一个表达式是否正确. 二. 实验环境 操作系统:window xp 编写环境:visual c++ 编写语言:c语言 三. 实验内容 程序输入/输出示例: 如参考C语言的运算符.输入如下表达式(以分号为结束)和输出结果: (1)10; 输出:正确 (2)1+2; 输出:正确 (3)(1+2)/3+4-(5+6/7); 输出:正

编译原理实验 —— 语法分析器

/* 待分析的简单语言的语法 用扩充的BNF表示如下: ⑴<程序>::=begin<语句串>end ⑵<语句串>::=<语句>{:<语句>} ⑶<语句>::=<赋值语句> ⑷<赋值语句>::=ID:=<表达式> ⑸<表达式>::=<项>{+<项> | -<项>} ⑹<项>::=<因子>{*<因子> | /<因子

编译原理 实验2 DFA的运行

DFA的运行 一. 实验目的 1.理解有穷自动机的作用: 2.利用状态图和状态表表示有穷自动机: 3.以程序实现有穷自动机的运行过程; 4.利用状态表和有穷自动机的运行原理编制程序,使得程序能够识别一个输入串是否为一个有效的符号串.具体可以选择下面之一:无符号定点实数,无符号正偶数,自然数,整数,十六进制数,或其他自己定义的符号串. 二. 实验环境 操作系统:window xp 编写环境:visual c++ 编写语言:c语言 三. 实验内容 1.简单介绍你所设计的有穷自动机.(要求必须完成无符

编译原理 - 实验二 - FLEX词法分析器

FLEX词法分析器 一.Lex和Yacc介绍 Lex 是一种生成扫描器的工具.扫描器是一种识别文本中的词汇模式的程序. 一种匹配的常规表达式可能会包含相关的动作.这一动作可能还包括返回一个标记. 当 Lex 接收到文件或文本形式的输入时,它试图将文本与常规表达式进行匹配. 它一次读入一个输入字符,直到找到一个匹配的模式. 如果能够找到一个匹配的模式,Lex 就执行相关的动作(可能包括返回一个标记). 另一方面,如果没有可以匹配的常规表达式,将会停止进一步的处理,Lex 将显示一个错误消息. Ya