【问题标题】:post-fix lexical analyzer后修复词法分析器
【发布时间】:2018-12-14 02:34:24
【问题描述】:

我的任务是为后缀表达式编写一个非常简单的词法分析器:

print ("enter each variable followed by a space" );
numbers = input("Enter the numbers: ") #ask for input

numbersArray = [] #array to store the input

for number in numbers:
    numbersArray.append(number)

numbersArray = numbersArray[::2]

print(numbersArray);

for x in numbersArray:

    if x == "_": print ( "     " , " delimeter" )
    elif x == "-": print ( "    ", " subtraction opp." )
    elif x == "/": print ( "    ", " divison opp." )
    elif x == "+": print ( "    ", " addition opp." )
    elif x == "*": print ( "    ", " multplication opp." )
    elif x == "0": print ( "    ", " Constant: 0 " )
    elif x == "1": print ( "    ", " Constant: 1" )
    elif x == "2": print ( "    ", " Constant: 2" )
    elif x == "3": print ( "    ", " Constant: 3" )
    elif x == "4": print ( "    ", " Constant: 4" )
    elif x == "5": print ( "    ", " Constant: 5" )
    elif x == "6": print ( "    ", " Constant: 6" )
    elif x == "7": print ( "    ", " Constant: 7" )
    elif x == "8": print ( "    ", " Constant: 8" )
    elif x == "9": print ( "    ", " Constant: 9" )
    elif x == "10": print ( "    ", " Constant: 10" )
    print(x) 

一个样本输入:3 _ 4 _ 5 _ +

以上是我开始的,这是我第一次使用 python,我一直在努力解决这个问题。我想知道是否有更好的方法可以将更大的数字和字母分别识别为常量和变量?

【问题讨论】:

  • 词法分析器部分的常用方法是正则表达式(re 模块)。
  • 查看rplyply 了解python lex/parse 库。如果你打算自己写,至少看看他们的来源,让你走上正确的道路。
  • 谢谢两位。我会调查他们两个,让你知道会发生什么

标签: python compiler-construction


【解决方案1】:

我同意评论者的观点,即使用像 ply 这样的词法库是最简单或最好的方法。如果您仍然想/被要求自己做,有几件事需要改变。

如果您看到类似132 的内容,您需要能够跳到下一个循环迭代的数字,因此for x in numbersArray: 不起作用。您可以只做一个while True,手动跟踪循环索引,然后在完成后中断。

将您的输入与词位匹配的最强大的方法是使用regular expressions。例如,您可以使用类似的方式匹配带有可选小数部分的数字

import re
...
re.match(r'\d+(\.\d*)?', numbersArray[current_index:])

(大多数数字规范比这更“有趣”,所以绝对不要复制我的正则表达式。这可能是你需要的错误。)

您可以使用regex101.com 来试验和构建您的正则表达式。

您也可以使用 Python 内置的 string methods,例如 isnumericisalpha。有了这个,你的号码检查可能看起来像

lexeme = ''
while numbersArray[current_index].isdigit():
    lexeme += numbersArray[current_index]
    current_index += 1

【讨论】:

  • 与问题/答案无关的挑剔:字符串已经是可迭代的,因此将所有内容复制到 numbersArray 似乎没用。我相信你的x == "10" 检查会失败。
猜你喜欢
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多