sicily1001. 输入输出LL(1)语法分析程序 **

本文介绍了一个LL(1)语法分析程序的设计与实现,包括如何读取输入的文法信息,构建LL(1)分析表,并进行语法分析的过程展示。通过具体的样例输入输出,展示了分析程序的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sicily1001. 输入输出LL(1)语法分析程序 **

题目:
Time Limit: 1sec    Memory Limit:256MB
Description

 输入开始符号,非终结符,终结符,产生式,LL(1)分析表
输出LL(1)分析表

Input

 输入开始符号;
非终结符个数,非终结符,空格符分隔;
终结符个数,终结符,空格符分隔;
产生式的个数,各产生式的序号,产生式的左边和右边符号,空格符分隔;
LL(1)分析表中的产生式个数,序号,行符号,列符号,产生式编号,空格符分隔;
输入一个算术式符号串,用#结束

Output

 输出推导过程,每一步一行,中间“ & ”前是已经识别的子串,后是栈中信息。

Sample Input
 Copy sample input to clipboard
E
6  E A T B F D
9  + - * / ( ) x y z 
13
1  E TA
2  A +TA
3  A -TA
4  A k
5  T FB
6  B *FB
7  B /FB
8  B k
9  F (E)
10 F D
11 D x
12 D y
13 D z
25
1  E ( 1
2  E x 1
3  E y 1
4  E z 1
5  A + 2
6  A - 3
7  A ) 4
8  A # 4
9  T ( 5
10 T x 5
11 T y 5
12 T z 5
13 B + 8
14 B - 8
15 B * 6
16 B / 7
17 B ) 8
18 B # 8
19 F ( 9
20 F x 10
21 F y 10
22 F z 10
23 D x 11
24 D y 12
25 D z 13
(x+(y-x*z)*(y+x*z))+x/z#
Sample Output
# & E#
# & TA#
# & FBA#
# & (E)BA#
#( & E)BA#
#( & TA)BA#
#( & FBA)BA#
#( & DBA)BA#
#( & xBA)BA#
#(x & BA)BA#
#(x & A)BA#
#(x & +TA)BA#
#(x+ & TA)BA#
#(x+ & FBA)BA#
#(x+ & (E)BA)BA#
#(x+( & E)BA)BA#
#(x+( & TA)BA)BA#
#(x+( & FBA)BA)BA#
#(x+( & DBA)BA)BA#
#(x+( & yBA)BA)BA#
#(x+(y & BA)BA)BA#
#(x+(y & A)BA)BA#
#(x+(y & -TA)BA)BA#
#(x+(y- & TA)BA)BA#
#(x+(y- & FBA)BA)BA#
#(x+(y- & DBA)BA)BA#
#(x+(y- & xBA)BA)BA#
#(x+(y-x & BA)BA)BA#
#(x+(y-x & *FBA)BA)BA#
#(x+(y-x* & FBA)BA)BA#
#(x+(y-x* & DBA)BA)BA#
#(x+(y-x* & zBA)BA)BA#
#(x+(y-x*z & BA)BA)BA#
#(x+(y-x*z & A)BA)BA#
#(x+(y-x*z & )BA)BA#
#(x+(y-x*z) & BA)BA#
#(x+(y-x*z) & *FBA)BA#
#(x+(y-x*z)* & FBA)BA#
#(x+(y-x*z)* & (E)BA)BA#
#(x+(y-x*z)*( & E)BA)BA#
#(x+(y-x*z)*( & TA)BA)BA#
#(x+(y-x*z)*( & FBA)BA)BA#
#(x+(y-x*z)*( & DBA)BA)BA#
#(x+(y-x*z)*( & yBA)BA)BA#
#(x+(y-x*z)*(y & BA)BA)BA#
#(x+(y-x*z)*(y & A)BA)BA#
#(x+(y-x*z)*(y & +TA)BA)BA#
#(x+(y-x*z)*(y+ & TA)BA)BA#
#(x+(y-x*z)*(y+ & FBA)BA)BA#
#(x+(y-x*z)*(y+ & DBA)BA)BA#
#(x+(y-x*z)*(y+ & xBA)BA)BA#
#(x+(y-x*z)*(y+x & BA)BA)BA#
#(x+(y-x*z)*(y+x & *FBA)BA)BA#
#(x+(y-x*z)*(y+x* & FBA)BA)BA#
#(x+(y-x*z)*(y+x* & DBA)BA)BA#
#(x+(y-x*z)*(y+x* & zBA)BA)BA#
#(x+(y-x*z)*(y+x*z & BA)BA)BA#
#(x+(y-x*z)*(y+x*z & A)BA)BA#
#(x+(y-x*z)*(y+x*z & )BA)BA#
#(x+(y-x*z)*(y+x*z) & BA)BA#
#(x+(y-x*z)*(y+x*z) & A)BA#
#(x+(y-x*z)*(y+x*z) & )BA#
#(x+(y-x*z)*(y+x*z)) & BA#
#(x+(y-x*z)*(y+x*z)) & A#
#(x+(y-x*z)*(y+x*z)) & +TA#
#(x+(y-x*z)*(y+x*z))+ & TA#
#(x+(y-x*z)*(y+x*z))+ & FBA#
#(x+(y-x*z)*(y+x*z))+ & DBA#
#(x+(y-x*z)*(y+x*z))+ & xBA#
#(x+(y-x*z)*(y+x*z))+x & BA#
#(x+(y-x*z)*(y+x*z))+x & /FBA#
#(x+(y-x*z)*(y+x*z))+x/ & FBA#
#(x+(y-x*z)*(y+x*z))+x/ & DBA#
#(x+(y-x*z)*(y+x*z))+x/ & zBA#
#(x+(y-x*z)*(y+x*z))+x/z & BA#
#(x+(y-x*z)*(y+x*z))+x/z & A#
#(x+(y-x*z)*(y+x*z))+x/z & #

代码:
#include <cstring>
#include <string.h>
#include <iostream>
#include <iomanip>
#include <vector>
#include <stack>
using namespace std;

struct v {
    char vn;
    string vt;
    //v(string vn1, string vt1) {vn = vn1, vt = vt1;}
};

struct sel {
    char v, t;
    int ch;
};

vector<char> s1,s2; //s1非终结符, s2终结符
vector<v> s3;
vector<sel> s4;
string result;
stack<char> room;

string find(char v, char t) {
    for (auto i : s4) {
        if (i.v == v&&i.t == t) return s3[i.ch-1].vt;
    }
    return "";
}
bool in_v(char v) {
    for (auto i : s1) {
        if (i == v) return true;
    }
    return false;
}

bool in_t(char t) {
    for (auto i : s2) {
        if (i == t) return true;
    }
    return false;
}

int main() {
    char start;
    cin >> start;
    int s1num, s2num, s3num,s4num;
    cin >> s1num;
    for (int i = 0; i < s1num; i++) {
        char tmp;
        cin >> tmp;
        s1.push_back(tmp);
    }
    cin >> s2num;
    for (int i = 1; i <= s2num; i++) {
        char tmp;
        cin >> tmp;
        s2.push_back(tmp);
    }
    s2num++;
    s2.push_back('#');
    cin >> s3num;
    for (int i = 1; i <= s3num; i++) {
        char vn;
        string vt;
        int n;
        cin >> n;
        cin >> vn;
        cin >> vt;
        v tmp;
        tmp.vn = vn, tmp.vt = vt;
        s3.push_back(tmp);
    }
    cin >> s4num;
    for (int i = 1; i <= s4num; i++) {
        char v, t;
        int num, n;
        cin >> n,cin >> v >> t, cin >> num;
        sel tmp;
        tmp.v = v, tmp.t = t, tmp.ch = num;
        s4.push_back(tmp);
    }
    cin >> result;
    room.push('#');
    room.push(start);
    int tag = 0;
    while (1) {
        stack<char> tmp = room;
        cout << "#";
        for (int i = 0; i < tag; ++i) {
            cout << result[i];
        }
        cout << " & ";
        while (!tmp.empty()) {
            cout << tmp.top();
            tmp.pop();
        }
        cout << endl;
        if (in_v(room.top())) {
            string k = find(room.top(), result[tag]);
            room.pop();
            for (int i = k.size() - 1; i >= 0; i--) {
                if (k[i] == 'k') continue;
                room.push(k[i]);
            }
        } else if (room.top() == '#') break;
        else {
            tag++;
            room.pop();
        }
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值