#YDRS007A. [花式编译 #1] 成为初级表达式大师

[花式编译 #1] 成为初级表达式大师

题目背景

《编译原理》是一门非常有意思的课程。整门课程的关键任务在于:搞清楚编译器是如何实现的,并实现它。其中涉及了很多精妙的算法、有趣的设计和伟大的灵魂(e.g. Mr. Knuth) 。

我们也希望正在做题的你,也能在 OI 这方乱世中领略到一些编译器的美。当然,千里之行,始于足下。所以,我们的挑战,将会是以渐进式的方式来进行。

To be continued ... !

题目描述

本题是云斗【花式编译】系列题目的 #1 题。

本题的任务非常简单:输出给定程序的运行结果。如果将任务划分的更详细一点,那便是:识别出一些变量的值,并且计算出表达式的最终结果。

具体的,你会接收到形如以下格式的输入:

int main() {
    int a = 5 ;
    int b = 4 ;
    int c = 3 ;
    int d = 2 ;
    int e = 1 ;
    printTheRes(a * b + c - d / e) ; 
    return 0 ;
}

其中:

  • 第一行 int main(){ 用于声明主函数。保证大括号不会换行 (谨遵教义)
  • 2?2\sim ? 行,每行都是一个形如 int x = [数字] ; 的语句,用于定义变量。
    • 保证变量名 x 仅包含一个英文字母,且 [数字] 仅为个位数
  • ?+1? + 1 行,保证只有一个形如 printTheRes(表达式); 的输出语句。
    • printTheRes() 函数是一个默认预设函数,可以理解为是一个用于输出表达式结果的超级输出函数。代码中默认可以直接调用这个函数。
    • 具体用法可以通过如下例子说明: printTheRes(X)cout << (X) << endl 在语义上是等价的,其中 X 是符合题目要求的合法表达式
  • ?+2?+2 行,保证只有一个合法的返回值语句,即 return 0;
  • ?+3?+3 行,保证只有一个 }
  • 有关表达式的格式:
    • 表达式中包含字母(变量名)和运算符。不包含数字或未预先定义的变量名。
    • 本题的测试数据中不会出现括号 ()[]
    • 本题的测试数据中包含以下运算符: +-*/%<>>=<=!===
    • 表达式的语法保证正确,即符合 C 语言的语法规则。
  • 最后,我们不能限制程序员的 coding 喜好,对吧?因此,本题的测试数据中,会存在一些不影响代码本身正确性的多余空格(但显然,不会有多余的空行)。这部分可能会对你的算法存在一定影响。也就是说,你需要为以下代码风格做好准备:
int main() {
    int a =         5 ;
    int      b       =        4 ;
    int c =      3       ;
    int d =      2 ;
    int        e = 1 ;
    printTheRes(a *             b + c - d /            e) ; 
    return 0 ;
}

给出的代码,保证在补足缺省函数实现的前提下,能够直接在 C 语言编译环境中正确运行

输入输出格式

输入

输入包含多行字符串(一个 C 语言程序)。具体的输入格式参考【题目描述】中的解释。

输出

共一行 11 个数字,表示输入程序的运行结果。

样例

int main() {
    int a = 5 ;
    int b = 4 ;
    int c = 3 ;
    int d = 2 ;
    int e = 1 ;
    printTheRes(a     * b+c-d/e) ; 
    return 0 ;
}
21
int main() {
    int a = 5 ;
    int B = 4 ;
    int c = 3 ;
    int D = 2 ;
    int E = 1 ;
    int F = 0 ;
    printTheRes(a<=B>c+F-E%D*c-F!=B-a<c) ; 
    return 0 ;
}
1

数据范围

对于 40%40\% 的数据,保证只存在 +- 两种运算符。

对于 60%60\% 的数据,保证只存在 +-*/% 五种运算符。

对于全部 100%100\% 的数据,保证全部赋值语句的右值只会是 <10< 10 的非负整数,保证全部的变量名均为单个英文字母,保证总代码长度不会超过 1.5 KB,保证只存在以下运算符: +-*/%<>>=<=!===

注意:作为输入数据的 C 语言代码中,可能存在多余但不影响语义的空格。