不确定这是问的正确地方,但我真的需要帮助,弄清楚我做错了什么。我想写一个程序,检查输入是否符合语法。
以下是每个语法规则的五个函数:
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
,它不会停止功能(它不应该)。这就是为什么你得到一个TypeError
与A
:而不是停止函数,你发送一个空队列到你的number
函数。 - 你的代码中有很多重复,我认为这个代码应该属于你的
LinkedQueue
(所有的if peek=='': dequeue
) - 我不认为在最后添加一个空字符串对你有任何帮助
我不知道如何正确地纠正这些问题,但LinkedQueue
需要认真反思。
对于第二个错误,你的代码违背了你的规则:小写字母是可选的,但你把它变成了强制性的。lowercase_letter
函数不应该引发任何错误。
您的lowercase_letter
和capital_letter
函数还有另一个问题:您在测试之前脱队列。现在它静默了,因为如果测试失败,就会引发异常,但在另一个上下文中,这种行为可能是意外结果的来源。假设你从lowercase_letter
中删除了异常,你的输入是A3
:你弹出的数字认为它是一个字母,现在你的堆栈是空的。没有raise,所以你的代码返回molecule
调用number
并再次抛出TypeError