如何获取自定义语言中 if 语句的 "ENDIF" 字符串的下一个实例
How to get the next instance of an "ENDIF" string for if statement in custom language
我正在制作一种自定义语言并用 Python 编写它。我有带有数字等式和不等式的 if 语句,但我无法在 if 语句块中实现代码的条件执行。这是我的 if 语句分词器代码:
elif tok == "IF":
tokens.append("IF")
tok = ""
elif tok == "THEN":
if expr != "" and isexpr == 0:
tokens.append("NUM:" + expr)
expr = ""
tokens.append("THEN")
tok = ""
我还使用字符串 "ENDIF" 来结束 if 语句。本质上,"THEN" 是左括号,"ENDIF" 是右括号,如果这是一种使用括号的语言。
int eq/ineq if 语句的解析器:
elif toks[i] + " " + toks[i+1][0:3] + " " + toks[i+2] + " " + toks[i+3][0:3] + " " + toks[i+4] == "IF NUM LESSTHAN NUM THEN":
if toks[i+1][4:] < toks[i+3][4:]:
print("TRUE, " + toks[i+1][4:] + " is less than " + toks[i+3][4:])
else:
print("TRUE, " + toks[i+1][4:] + " is not less than " + toks[i+3][4:])
i += 5
elif toks[i] + " " + toks[i+1][0:3] + " " + toks[i+2] + " " + toks[i+3][0:3] + " " + toks[i+4] == "IF NUM MORETHAN NUM THEN":
if toks[i+1][4:] > toks[i+3][4:]:
print("TRUE, " + toks[i+1][4:] + " is greater than " + toks[i+3][4:])
else:
print("FALSE, " + toks[i+1][4:] + " is not greater than " + toks[i+3][4:])
i += 5
elif toks[i] + " " + toks[i+1][0:3] + " " + toks[i+2] + " " + toks[i+3][0:3] + " " + toks[i+4] == "IF NUM LESSOREQUAL NUM THEN":
if toks[i+1][4:] <= toks[i+3][4:]:
print("TRUE, " + toks[i+1][4:] + " is less than or equal to " + toks[i+3][4:])
else:
print("FALSE, " + toks[i+1][4:] + " is not less than or equal to " + toks[i+3][4:])
i += 5
elif toks[i] + " " + toks[i+1][0:3] + " " + toks[i+2] + " " + toks[i+3][0:3] + " " + toks[i+4] == "IF NUM MOREOREQUAL NUM THEN":
if toks[i+1][4:] >= toks[i+3][4:]:
print("TRUE, " + toks[i+1][4:] + " is greater than or equal to " + toks[i+3][4:])
else:
print("FALSE, " + toks[i+1][4:] + " is not greater than or equal to " + toks[i+3][4:])
i += 5
elif toks[i] + " " + toks[i+1][0:3] + " " + toks[i+2] + " " + toks[i+3][0:3] + " " + toks[i+4] == "IF NUM NOTEQUAL NUM THEN":
if toks[i+1][4:] != toks[i+3][4:]:
print("TRUE, " + toks[i+1][4:] + " is not equal to " + toks[i+3][4:])
else:
print("FALSE, " + toks[i+1][4:] + " is equal to " + toks[i+3][4:])
i += 5
这是我的语言中的 if 语句示例:
IF 1 == 2 THEN
OUT "Hello, world!"
ENDIF
显然,那将 return 为假,但它现在仍然打印 Hello World,因为我不知道如何跳过代码,如果它 return 为假...我正在考虑跳到文件中的下一个 endif ...我想我知道该怎么做。我只需要在 tokens[] 数组中找到令牌的位置...如果我能做到这一点,那么我就可以将迭代器变量设置为超过 ENDIF。有没有一个函数可以让我在数组中搜索某个位置之后字符串的下一次出现(例如,tokens[4:]),然后 return 该元素在数组中的索引值?
提前致谢!
我明白了!
虽然它非常原始并且不支持嵌套(目前),但我有一个简单的解决方案来解决我的问题。基本上,每当它检测到 'IF' 标记时,它都会循环遍历之后的所有标记,直到找到 'ENDIF' 标记。在执行此操作时,它会递增一个名为 'ii' 的迭代器,并在最后将主迭代器设置为超过 'ENDIF',忽略 if 语句中的代码。仅当条件解析器 returns false.
时才执行此操作
代码:
def doIF_FALSE(tokens):
ii = 0
for token in tokens:
if token == "IF":
ii = 1
elif token == "ENDIF":
ii += 1
break
else:
ii += 1
return ii
对于调用,我这样设置迭代器值:i = doIF_FALSE(tokens[i:])
示例代码:
IF 1 > 2 THEN
OUT "1 is greater than 2"
ENDIF
OUT "You passed the if statement"
输出:
"You passed the if statement"
注意:是的,我知道这与我问的另一个问题的答案相同,但它们基本上是同一个问题...
我正在制作一种自定义语言并用 Python 编写它。我有带有数字等式和不等式的 if 语句,但我无法在 if 语句块中实现代码的条件执行。这是我的 if 语句分词器代码:
elif tok == "IF":
tokens.append("IF")
tok = ""
elif tok == "THEN":
if expr != "" and isexpr == 0:
tokens.append("NUM:" + expr)
expr = ""
tokens.append("THEN")
tok = ""
我还使用字符串 "ENDIF" 来结束 if 语句。本质上,"THEN" 是左括号,"ENDIF" 是右括号,如果这是一种使用括号的语言。
int eq/ineq if 语句的解析器:
elif toks[i] + " " + toks[i+1][0:3] + " " + toks[i+2] + " " + toks[i+3][0:3] + " " + toks[i+4] == "IF NUM LESSTHAN NUM THEN":
if toks[i+1][4:] < toks[i+3][4:]:
print("TRUE, " + toks[i+1][4:] + " is less than " + toks[i+3][4:])
else:
print("TRUE, " + toks[i+1][4:] + " is not less than " + toks[i+3][4:])
i += 5
elif toks[i] + " " + toks[i+1][0:3] + " " + toks[i+2] + " " + toks[i+3][0:3] + " " + toks[i+4] == "IF NUM MORETHAN NUM THEN":
if toks[i+1][4:] > toks[i+3][4:]:
print("TRUE, " + toks[i+1][4:] + " is greater than " + toks[i+3][4:])
else:
print("FALSE, " + toks[i+1][4:] + " is not greater than " + toks[i+3][4:])
i += 5
elif toks[i] + " " + toks[i+1][0:3] + " " + toks[i+2] + " " + toks[i+3][0:3] + " " + toks[i+4] == "IF NUM LESSOREQUAL NUM THEN":
if toks[i+1][4:] <= toks[i+3][4:]:
print("TRUE, " + toks[i+1][4:] + " is less than or equal to " + toks[i+3][4:])
else:
print("FALSE, " + toks[i+1][4:] + " is not less than or equal to " + toks[i+3][4:])
i += 5
elif toks[i] + " " + toks[i+1][0:3] + " " + toks[i+2] + " " + toks[i+3][0:3] + " " + toks[i+4] == "IF NUM MOREOREQUAL NUM THEN":
if toks[i+1][4:] >= toks[i+3][4:]:
print("TRUE, " + toks[i+1][4:] + " is greater than or equal to " + toks[i+3][4:])
else:
print("FALSE, " + toks[i+1][4:] + " is not greater than or equal to " + toks[i+3][4:])
i += 5
elif toks[i] + " " + toks[i+1][0:3] + " " + toks[i+2] + " " + toks[i+3][0:3] + " " + toks[i+4] == "IF NUM NOTEQUAL NUM THEN":
if toks[i+1][4:] != toks[i+3][4:]:
print("TRUE, " + toks[i+1][4:] + " is not equal to " + toks[i+3][4:])
else:
print("FALSE, " + toks[i+1][4:] + " is equal to " + toks[i+3][4:])
i += 5
这是我的语言中的 if 语句示例:
IF 1 == 2 THEN
OUT "Hello, world!"
ENDIF
显然,那将 return 为假,但它现在仍然打印 Hello World,因为我不知道如何跳过代码,如果它 return 为假...我正在考虑跳到文件中的下一个 endif ...我想我知道该怎么做。我只需要在 tokens[] 数组中找到令牌的位置...如果我能做到这一点,那么我就可以将迭代器变量设置为超过 ENDIF。有没有一个函数可以让我在数组中搜索某个位置之后字符串的下一次出现(例如,tokens[4:]),然后 return 该元素在数组中的索引值?
提前致谢!
我明白了! 虽然它非常原始并且不支持嵌套(目前),但我有一个简单的解决方案来解决我的问题。基本上,每当它检测到 'IF' 标记时,它都会循环遍历之后的所有标记,直到找到 'ENDIF' 标记。在执行此操作时,它会递增一个名为 'ii' 的迭代器,并在最后将主迭代器设置为超过 'ENDIF',忽略 if 语句中的代码。仅当条件解析器 returns false.
时才执行此操作代码:
def doIF_FALSE(tokens):
ii = 0
for token in tokens:
if token == "IF":
ii = 1
elif token == "ENDIF":
ii += 1
break
else:
ii += 1
return ii
对于调用,我这样设置迭代器值:i = doIF_FALSE(tokens[i:])
示例代码:
IF 1 > 2 THEN
OUT "1 is greater than 2"
ENDIF
OUT "You passed the if statement"
输出:
"You passed the if statement"
注意:是的,我知道这与我问的另一个问题的答案相同,但它们基本上是同一个问题...