zoukankan      html  css  js  c++  java
  • 编译原理实验: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 #

     运行结果测试:

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

  • 相关阅读:
    bzoj2748:[HAOI2012]音量调节
    bzoj2287:[POJ Challenge]消失之物
    bzoj1485:[HNOI2009]有趣的数列
    Codeforces 620E New Year Tree
    CF813E Army Creation
    527D.Clique Problem
    4337: BJOI2015 树的同构
    Codeforces Round #443 (Div. 1) C. Tournament
    [BZOJ4913][SDOI2017]遗忘的集合
    [八省联考2018]林克卡特树lct
  • 原文地址:https://www.cnblogs.com/Calor/p/11651489.html
Copyright © 2011-2022 走看看