编译原理实验Sicily--3-LR(K) 分析法语法制导翻译程序

Description

 输入开始符号,非终结符,终结符,语意动作表,产生式
输出简单优先法的语意处理动作
以拓广算术表达式G[A]: 为例
A→E
E→E+T | T
T→T*F | F
F→(E) | a

Input

 输入开始符号;
非终结符个数,非终结符,空格符分隔;
终结符个数,终结符,空格符分隔;
语意动作个数,语意动作符,空格符分隔;
产生式的个数,各产生式的序号,产生式的左边和右边符号源产生式,目标产生式,空格符分隔;
状态数,ACTION列数,GOTO列数,空格符分隔;
状态,ACTION矩阵(k 0 表示空 A 0 表示接收),GOTO矩阵(0表示 空),空格符分隔;
输入分析字符串,#结束

Output

输出分析过程;
语意动作符序列;用空格隔开,第一个动作前有一空格。

Sample Input

A
4  E T F A
6  a +  * ( ) #
3  1 2 3
7
0  A E     0
1  E E+T   1
2  E T     0
3  T T*F   2
4  T F     0
5  F (E)   0
6  F a     3

3
1 ADD
2 MUL
3 x

12 6 3
0  s 5  k 0  k 0  s 4  k 0  k 0  1 2 3
1  k 0  s 6  k 0  k 0  k 0  A 0  0 0 0
2  k 0  r 2  s 7  k 0  r 2  r 2  0 0 0
3  k 0  r 4  r 4  k 0  r 4  r 4  0 0 0
4  s 5  k 0  k 0  s 4  k 0  k 0  8 2 3
5  k 0  r 6  r 6  k 0  r 6  r 6  0 0 0
6  s 5  k 0  k 0  s 4  k 0  k 0  0 9 3
7  s 5  k 0  k 0  s 4  k 0  k 0  0 0 10
8  k 0  s 6  k 0  k 0  s 11 k 0  0 0 0
9  k 0  r 1  s 7  k 0  r 1  r 1  0 0 0
10 k 0  r 3  r 3  k 0  r 3  r 3  0 0 0
11 k 0  r 5  r 5  k 0  r 5  r 5  0 0 0

(a+a)*a#

Sample Output

 x x ADD x MUL   

程序:

#include <iostream>
#include <map>
#include <string>
#include <string.h>
#include <iomanip>
#include <stack>
#include <cmath>
#include <vector>
using namespace std;

int myatoi(const char* p) {
    int length = strlen(p);
    int res = 0;
    for (int i = 0; i < strlen(p); i++) {
        res *= 10;
        res += (p[i] - '0');
    }
    return res;
}

string reverseString(string s) {
    string res;
    for(int i = s.size() - 1; i >= 0; i--) res += s[i];
    return res;
}

struct Production {
    int n;
    string left;
    string right;
};

int main(){
    char S;
    cin >> S;
    int nonterminal_num;
    cin >> nonterminal_num;
    string nonterminal[nonterminal_num];
    map<string, int> mapping;
    for (int i = 0; i < nonterminal_num; i++) {
        cin >> nonterminal[i];
    }
    int terminal_num;
    cin >> terminal_num;
    string terminal[terminal_num];
    for (int i = 0; i < terminal_num; i++) {
        cin >> terminal[i];
        mapping.insert(make_pair(terminal[i],i));
    }
    for (int i = 0; i < nonterminal_num; i++)
        mapping.insert(make_pair(nonterminal[i], i + terminal_num));
        
    int semantic_action_num;
    cin >> semantic_action_num;
    string semantic_action_symbol;
    while (semantic_action_num--) cin >> semantic_action_symbol;
    
    int production_num;
    cin >> production_num;
    vector<int> goal_production;
    goal_production.resize(production_num);
    Production production[production_num];
    for (int i = 0; i < production_num; i++) 
        cin >> production[i].n >> production[i].left >> production[i].right >> goal_production[i];
       
    cin >> semantic_action_num;
    map<int, string> semantic_action;
    int i;
    string s;
    while (semantic_action_num--){
        cin >> i >> s;
        semantic_action.insert(make_pair(i, s));
    }
        
    
    int row_size;
    cin >> row_size;
    int action_column_size;
    cin >> action_column_size;
    int goto_column_size;
    cin >> goto_column_size;
    string table[row_size][action_column_size + goto_column_size];
    int dummy;
    for (int i = 0; i < row_size; i++) {
        cin >> dummy;
        string front, back;
        for (int j = 0; j < action_column_size; j++) {
            cin >> front >> back;
            table[i][j] = front + back;
        }
        for (int j = action_column_size; j < action_column_size + goto_column_size; j++) {
            cin >> table[i][j];
        }
    } 
    
    string str;
    cin >> str;
    
    stack<string> stk;
    int cursor = 0;
    stk.push("#");
    stk.push("0");
    while (true) {
        int row = myatoi(stk.top().c_str());
        char *p = new char;
        strncpy(p, &str[cursor], 1);
        p[1]='\0';
        string col = p;
        int column = mapping[col];
        delete p;
        string res = table[row][column];
a:      if(res[0] == 's') {
            char *p = new char;
            strncpy(p, &str[cursor], 1);
            p[1]='\0';
            string col = p;
            stk.push(col);
            cursor++;
            delete p;
            stk.push(res.substr(1, res.size() - 1));
        }
        else if (res[0] == 'r') {
            if (semantic_action.find(goal_production[myatoi(res.substr(1,res.size()-1).data())]) != semantic_action.end()) 
                cout << " " <<  semantic_action[goal_production[myatoi(res.substr(1,res.size()-1).data())]];
            int pop_num = production[myatoi(res.substr(1,res.size()-1).data())].right.size() * 2;
            while(pop_num--)  stk.pop();
            int row = myatoi(stk.top().c_str());
            int column = mapping[production[myatoi(res.substr(1,res.size()-1).data())].left];
            stk.push(production[myatoi(res.substr(1,res.size()-1).data())].left);
            res = table[row][column];
            stk.push(res);
            goto a;
        }
        else if (res[0] >= '0' && res[0] <= '9') {
            int row = myatoi(stk.top().c_str());
            char *p = new char;
            strncpy(p, &str[cursor], 1);
            p[1]='\0';
            string col = p;
            int column = mapping[col];
            res = table[row][column];
        }
        else if (res[0] == 'A') break;
        else break;
    }
    cout << " ";
    return 0;
}

 

毕业论文引言 随着计算机技术的发展与普及,计算机已经成为各行业最基本的工具之一,迅速进入千家万户。因此,掌握计算机应用的基本技能成为新世纪人才不可缺少的基本素质之一。为使计算机能正常工作, 除了构成计算机各个组成部分的物理设备外, 一般说来, 还必须要有指挥计算机“做什么”和“如何做”的“程序”。程序及其有关文档构成计算机软件, 其中用以书写计算机软件的语言称为计算程序设计语言。 1 计算程序设计语言简介 计算程序设计语言是计算机可以识别的语言,用于描述解决问题的方法,供计算机阅读和执行,通常简称为编程语言,是一组用来定义计算程序的语法规则。它是一种被标准化的交流技巧,用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。使用程序设计语言往往使程序员能够比使用机器语言更准确地表达他们所想表达的目的。对那些从事计算机科学的人来说,懂得程序设计语言是十分重要的,因为所有的程序都需要程序设计语言才能完成,而计算机的工作是用程序来控制的,离开了程序计算机将一事无成。 2 开发背景及意义 现有计算器不能计算表达式,这是一个缺陷,为此,开发了一个能直接计算表达式的计算器,这为计算提高了更大的方便,可以大幅度提高计算效率。 第二章 第三章 第一节 递归下降法的描述 3.1.1实现思想 它的主要原理是,对每个非终极符按其产生式结构构造相应语法分析程序,其中终极符产生匹配命令,而非终极符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与产生式结构几乎是一致的。文法中每个非终结符对应一个递归过程(子程序),每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时能够按LL(1)形式可唯一地确定选择某个候选式进行推导。 3.1.2算法的特点 递归下降法是语法分析中最易懂的一种方法。递归下降法要满足的条件:假设A的全部产生式为Aα1|α2|……|αn ,则必须满足如下条件才能保证可以唯一的选择合适的产生式 predict(Aαi)∩predict(Aαj)=Φ,当i≠j. 3.1.3构造递归下降语法分析程序 采用了递归子程序方法进行语法分析,对文法中的每个非终极符号按其产生式结构产生相应的语法分析程序,完成相应的识别任务。其中终结符产生匹配命令,非终结符则产生调用命令。每次进入子程序之前都预先读入一个单词。因为使用了递归下降方法,所以程序结构和层次清晰明了,易于手工实现,且时空效率较高。实际的语法分析工作,从调用总程序的分析子程序开始,根据产生式进行递归调用各个分析子程序。 第二节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值