Files
2026-02-13 23:38:38 +08:00

7.4 KiB
Raw Permalink Blame History

知识点

好的,我将为你系统整理这四章的全部知识点,按章节顺序分解并整合核心内容、定义、图示、流程图,并汇总例题。对于每章内容,我也会根据重点举一反三地出一些典型练习题并附上解析,帮助你理解和练习。 我完成后会通知你查看结果。

编程题

A

#include <bits/stdc++.h>
using namespace std;
string S[]={"main","if","else","for","while","int"};
void show(string s){
    if(s[0]>='0'&&s[0]<='9')
        cout << "(integer," << s << ")" << endl;
        else{
            int flag=0;
            for(int i=0;i<6;i++){
                if(s==S[i]){
                    flag=1;
                cout<<"(keyword,"<<s<<")"<<endl;
                }
            }
            if(flag==0)
            cout<<"(identifier,"<<s<<")"<<endl;
        }
}
int main()
{
    string s;
    while (cin >> s)
    {
        int len = s.length();
        string a = "";
        for (int i = 0; i < len; i++)
        {
            if (s[i] == '=' || s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '<' || s[i] == '>' || s[i] == '!')  
            {
                if (a.length())
                    show(a);
                a = "";
                if (i + 1 < len && s[i + 1] == '=')
                {
                    cout << "(operator," << s[i] << s[i + 1] << ")" << endl;
                    i++; // i+1,否则下次循环会重复判断
                }
                else
                    cout << "(operator," << s[i] << ")" << endl;
            }else if(s[i]=='('||s[i]==')'||s[i]=='{'||s[i]=='}'||s[i]==','||s[i]==';'){
                if(a.length())
                show(a);
                a="";
                cout << "(boundary," << s[i] << ")" << endl;
            }else
            a+=s[i];
        }
        if(a.length())
        show(a);
    }
}

两个特殊点

  • 就是分类要分好
  • 通过show()函数来将a给打印出来 这样打印其他operator||boundary的时候能打印干净

B

#include <bits/stdc++.h>
#include <regex>
using namespace std;
int main()
{
    string s;
    cin >> s;

    regex pattern(R"(^[+-]?((\d+\.\d+)([eE][+-]?\d+)?|(\d+)[eE][+-]?\d+)$)");
    cout << (regex_match(s, pattern) ? "YES\n" : "NO\n");
    return 0;
}
//  R"(^[\t]*[+-]?)"
// 1) 小数(两侧有数字)^[\t]* [+-]?((\d\.\d)   + 可选指数  ([eE][+-]?\d)?)
// 2) 整数 + 必须指数
// R"( ^[+-]?  ( (\d+\.\d+) ([eE][+-]?\d+)? |  (\d+)([eE][+-]?\d+) )$ )"    //^[+-]?可选正负号
    //(\d+\.\d+)任意小数
    //([eE][+-]?\d+)?可选指数
    //(\d+)任意整数
    //[eE][+-]?\d+ 必须整数

//R"(^[+-]?( (\d+\.\d+)([eE][+-]?\d+)? | (\d+)[eE][+-]?\d+ )   )"

C

#include <bits/stdc++.h>
using namespace std;

struct Node {
    string s1, s2;
};

Node p[101];
int var[26];
int expression(const string& s) {
    if (s.length() >= 3 && (s[1] == '+' || s[1] == '>')) {
        int a = s[0] - 'A';
        int b = s[2] - 'A';
        if (s[1] == '+') return var[a] + var[b];
        else return var[a] > var[b];
    }
    if (s[0] == '-') return -stoi(s.substr(1));
    return stoi(s);
}
int main() {
    int n, max_line = 0;
    string s1, s2;
    memset(var, 0, sizeof(var));
    while (cin >> n) {
        cin >> s1;
        p[n].s1 = s1;
        if (s1 != "STOP") {
            cin >> s2;
            p[n].s2 = s2;
        }
        max_line = max(max_line, n);  // 记录最大行号
    }
    for (int i = 1; i <= max_line; i++) {
        if (p[i].s1.empty()) continue;
        string cmd = p[i].s1, arg = p[i].s2;
        if (cmd == "LET") {
            int idx = arg[0] - 'A';
            var[idx] = expression(arg.substr(2));
        } else if (cmd == "PRINT") {
            int idx = arg[0] - 'A';
            cout << arg[0] << "=" << var[idx] << endl;
        } else if (cmd == "GOTO") {
            i = expression(arg) - 1;
        } else if (cmd == "IF") {
            if (!expression(arg)) i++;
        } else if (cmd == "STOP") {
            break;
        }
    }
}

D

#include <bits/stdc++.h>
using namespace std;
/*
    E→TG
    G→+TG | ε
    T→FS
    S→*FS | ε
    F→(E) | i
*/
void E();
void G();
void T();
void S();
void F();
int num = 0;
int idx = 0;
string s;
void E()
{
    if (s[idx] == '(' || s[idx] == 'i')
    {
        cout << num++ << " E-->TG" << endl;
        T();
        G();
    }
    else
    {
        puts("error");
        exit(0);
    }
}
void G()
{
    if (s[idx] == '+')
    {
        cout << num++ << " G-->+TG" << endl;
        idx++;
        T();
        G();
    }
    else
    {
        cout << num++ << " G-->&" << endl;
    }
}
void T()
{
    if (s[idx] == '(' || s[idx] == 'i')
    {
        cout << num++ << " T-->FS" << endl;
        F();
        S();
    }
    else
    {
        puts("error");
        exit(0);
    }
}
void S()
{ //    S→*FS | ε
    if (s[idx] == '*')
    {
        cout << num++ << " S-->*FS" << endl;
        idx++;
        F();
        S();
    }
    else
    {
        cout << num++ << " S-->&" << endl;
    }
}
void F()
{
    if (s[idx] == '(')
    {
        cout << num++ << " F-->(E)" << endl;
        idx++;
        E();
        if (s[idx] == ')')
            idx++;
        else
        {
            cout << "error" << endl;
            exit(0);
        }
    }
    else if (s[idx] == 'i')
    {
        cout << num++ << " F-->i" << endl;
        idx++;
    }
    else
    {
        puts("error");
        exit(0);
    }
}
int main()
{
    cin >> s;
    E();
    if (s[idx] == '#')
        cout << "accept" << endl;
    else
        cout << "error" << endl;
}

E

#include <bits/stdc++.h>
using namespace std;
char s[100];
int c = 0;
int num = 1;
void E();
void T();
void G();
void F();
void S();
void E() // E→TG
{
    if (s[c] == 'i' || s[c] == '(')
    {
        cout << num++ << " E->TG" << endl;
        T();
        G();
    }
    else
    {
        puts("error!");
        exit(0);
    }
}
// G→+TG | ε
void G()
{
    if (s[c] == '+')
    {
        cout << num++ << " G->+TG" << endl;
        c++; // 注意这里因为一s[c]一定是+ 那么下一次判断也就是
        // T() 和G()判断的时候 就应该从s[c++]开始 所以c++
        T();
        G();
    }
    else if (s[c] == ')' || s[c] == '#')
    {
        cout << num++ << " G->^" << endl; // 只有在 FOLLOW(G) 才能走 ε
    }
    else
    {
        puts("error!");
        exit(0);
    }
}
void T() // T→FS
{
    if (s[c] == 'i' || s[c] == '(')
    {
        cout << num++ << " T->FS" << endl;
        F();
        S();
    }
    else
    {
        cout << "error!" << endl;
        exit(0);
    }
}
void S() // S→*FS | ε
{
    if (s[c] == '*')
    {
        cout << num++ << " S->*FS" << endl;
        c++;
        F();
        S();
    }
    else if (s[c] == '+' || s[c] == ')' || s[c] == '#')
    {
        cout << num++ << " S->^" << endl; // 只有在 FOLLOW(S) 才能走 ε
    }
    else
    {
        puts("error!");
        exit(0);
    }
}
void F()
{
    if (s[c] == 'i')
    {
        cout << num++ << " F->i" << endl;
        c++;
    }
    else if (s[c] == '(')
    {
        cout << num++ << " F->(E)" << endl;
        c++;
        E();
        if (s[c] == ')')
            c++;
        else
        {
            cout << "error!" << endl;
            exit(0);
        }
    }
    else
    {
        cout << "error!" << endl;
        exit(0);
    }
}
int main()
{
    cin >> s;
    E();
    if (s[c] != '#')
        cout << "error!" << endl;
    else
        cout << "acc!" << endl;
}