我正在为我想要制作的语言制作一个基本的语法检查器。 词法分析器将一些东西传递给函数isIfStmt(),以检查它是否有效,如:
#IF#RPAREN...#LPAREN#NEWLINE...#VAR#ASSTOP#RPAREN...#LPAREN#NEWLINE...#END#SPACE#IF
这是我写的python代码:
def isIfStmt(ifStmt):
ifObj = re.match(r'\#IF\#LPAREN(.*)\#RPAREN(.*)\#END\#SPACE\#IF', ifStmt)
print(ifObj)
if not isLogicExp(ifObj.group(1)):
return False
if not isStmtList(ifObj.group(2)):
return False
if ifObj==None:
return False
return True
isLogicExp函数检查提供的逻辑表达式是否正确。和isStmtList检查里面的代码是否是一组有效的简单语句,可能包含另一个if。
问题是这个正则表达式匹配最后一个#LPAREN,我希望它匹配if stmt行中第一个左括号的那个。但它匹配所提供的参数中的最后一个。
if()
a=(10)
如果我将正则表达式更改为r'\#IF\#LPAREN[^\NEWLINE]\#RPAREN(.*)\#END\#SPACE\#IF'
,它也无法正常工作。
如果我尝试在#RPAREN中使用非贪婪的方法,那么在括号之间有一个问题,在logicalExp里面可以有更多。 我尝试使用非贪婪的方法#NEWLINE as,
r'\#IF\#LPAREN(.*)\#RPAREN?(#NEWLINE)(.*)\#END\#SPACE\#IF'
但它也没有用。我仍然匹配最后一个#RPAREN