语句解析

GitHub跳转原题关系图返回列表

按分号拆出赋值语句,用字典保存 a,b,c 当前值,顺序模拟变量或数字赋值。

OJ: luogu

题目 ID: P1597

难度:入门

标签:模拟字符串python

日期: 2026-06-19 09:22

题意

给出一串简化 PASCAL 赋值语句。只有 a,b,c 三个变量,初始值都是 0。每条语句形如 [变量]:=[变量或一位整数];。要求按顺序执行后输出 a,b,c

思路

用字典保存当前变量值:

python
values = {"a": 0, "b": 0, "c": 0}

输入语句都以分号结尾,可以先用 split(";") 拆开。对一条非空语句,例如 a:=3

  • statement[0] 是左边变量;
  • statement[3] 是右边内容。

右边如果是数字,就转成整数;否则就是变量名,取它当前的值。

这题是固定格式字符串模拟,不创建 brute.py。历史 C++ 文件保留但不作为本文代码。

Python 知识

  • /home/rainboy/mycode/hugo-blog/content/program_language/python/input_output_and_strings.mdsplit(";") 可以按分号拆分语句。
  • /home/rainboy/mycode/hugo-blog/content/program_language/python/collections_toolkit.md:普通 dict 适合保存变量名到当前值的映射。
  • right.isdigit() 判断右边是否为数字字符。
  • print(values["a"], values["b"], values["c"]) 会默认用空格分隔输出。

代码

python
code = input().strip()
values = {"a": 0, "b": 0, "c": 0}

for statement in code.split(";"):
    if not statement:
        continue
    left = statement[0]
    right = statement[3]
    if right.isdigit():
        values[left] = int(right)
    else:
        values[left] = values[right]

print(values["a"], values["b"], values["c"])

Pythonic 写法

partition 解析赋值语句:

python
values = {"a": 0, "b": 0, "c": 0}
for statement in filter(None, input().strip().split(";")):
    left, _, right = statement.partition(":=")
    values[left] = int(right) if right.isdigit() else values[right]
print(values["a"], values["b"], values["c"])

复杂度

设代码长度为 n,每个字符只被解析常数次,时间复杂度是 O(n)O(n),空间复杂度是 O(1)O(1)

总结

这题不需要真正写语法分析器。题目已经固定了语句格式,只要按分号拆开,再取固定位置模拟赋值即可。