如何编写一个检查输入是否符合语法的程序?



不确定这是问的正确地方,但我真的需要帮助,弄清楚我做错了什么。我想写一个程序,检查输入是否符合语法。

以下是每个语法规则的五个函数:

def molecule(q):      
atom(q)               # molecule starts with an atom
if q.peek() == "":    # if the next letter in the queue is none(end of line) dequeue the letter (end function)
q.dequeue()
else:                 # otherwise check if the atom is followed by a number
number(q)
def atom(q):
capital_letter(q)     # atom could be a single upper case letter
if q.peek() == "":    # if it's the end of the line dequeue the letter (end the function)
q.dequeue()
else:                 # if it's not the end of the line, check if its a lowercase letter
lowercase_letter(q)
def capital_letter(q):    # checks for capital letters
letter = q.dequeue()
if letter.isupper():
return
raise Syntaxerror("Missing capital letter")
def lowercase_letter(q):  # checks for lowercase letters
letter = q.dequeue()
if letter.islower():  
return
raise Syntaxerror("Expecting lowercase letter")
def number(q):            # checks if numbers are greater than 2
letter = q.peek()
if int(letter) >= 2:
return
raise Syntaxerror("Expecting numbers greater than 2")

但是,当启动程序时,它不完全遵循语法。根据这个程序工作的输入例如:Aa2和Ab我得到的输出是(正确的):

Follows the syntax

然而,像这样格式化的输入不起作用(应该起作用):A, B12和A3。输入"A"是:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

对于A3和B12我得到:

Wrong! Expecting lowercase letter

我看不出我在代码中哪里做错了,为什么它不遵循语法,感谢任何帮助!

抛出一个想法——为什么不使用正则表达式呢?如果你愿意,你可以自己计算:

import re
num = '[0-9]'
let = '[a-z]'
LET = '[A-Z]'
print(re.match(re.compile(f'(^{LET})|(^{LET}{let})'), 'Ss'))
print(re.match(re.compile(f'(^{LET})|(^{LET}{let})'), 'sS'))

首先,关于LinkedQueue的一些事情

  • 我认为你错了关于dequeue,它不会停止功能(它不应该)。这就是为什么你得到一个TypeErrorA:而不是停止函数,你发送一个空队列到你的number函数。
  • 你的代码中有很多重复,我认为这个代码应该属于你的LinkedQueue(所有的if peek=='': dequeue)
  • 我不认为在最后添加一个空字符串对你有任何帮助

我不知道如何正确地纠正这些问题,但LinkedQueue需要认真反思。

对于第二个错误,你的代码违背了你的规则:小写字母是可选的,但你把它变成了强制性的。lowercase_letter函数不应该引发任何错误。

您的lowercase_lettercapital_letter函数还有另一个问题:您在测试之前脱队列。现在它静默了,因为如果测试失败,就会引发异常,但在另一个上下文中,这种行为可能是意外结果的来源。假设你从lowercase_letter中删除了异常,你的输入是A3:你弹出的数字认为它是一个字母,现在你的堆栈是空的。没有raise,所以你的代码返回molecule调用number并再次抛出TypeError

相关内容

  • 没有找到相关文章

最新更新