- Ich verwende PLY 3.11 (die neueste Version, die auf PyPI verfügbar ist)
< li>Ich verwende Python 3.13
Code: Select all
ERROR: C:\Users\###\Desktop\Scratch\scrybe\src\scrybe\scriptparser\parser.py:236: Symbol 'NOT' used, but not defined as a token or a rule
WARNING: Token 'COMMENT' defined, but not used
WARNING: Token 'NEWLINE' defined, but not used
WARNING: Token 'UMINUS' defined, but not used
WARNING: There are 3 unused tokens
Traceback (most recent call last):
...
parser = yacc.yacc()
File "C:\Program Files\Python313\Lib\site-packages\ply\yacc.py", line 3432, in yacc
raise YaccError('Unable to build parser')
ply.yacc.YaccError: Unable to build parser
Code: Select all
reserved = {
...
"this": "THIS",
"not": "NOT",
"and": "AND",
...
}
tokens.extend(reserved.values())
...
def t_SYMBOL(token):
r"\b[a-zA-Z_]\w*\b"
token.type = reserved.get(token.value, "VARIABLE")
return token
Code: Select all
def p_logical_operation(prod):
"""logical_operation : expression LESSTHAN expression
| expression GREATERTHAN expression
| expression LESSTHANEQUAL expression
| expression GREATERTHANEQUAL expression
| expression EQUALTO expression
| expression NOTEQUALTO expression
| expression AND expression
| expression OR expression
| expression IN expression
| NOT expression"""
prod[0] = {
"lexpos": prod.lexpos(1) if len(prod) == 3 else prod[1]["lexpos"] if isinstance(prod[1], dict) else prod.lexpos(2),
"type": "logical operation",
"condition": prod[2] if len(prod) == 4 else prod[1],
}
if len(prod) == 4:
prod[0].update({
"comparand 1": prod[1],
"comparand 2": prod[3]
})
else:
prod[0].update({"comparand": prod[2]})
Frage: Warum ist PLY nicht möglich? das „NOT“-Token zu erkennen, obwohl es im reservierten Wörterbuch definiert ist, insbesondere angesichts der Tatsache, dass ich es durch jedes andere reservierte Schlüsselwort ersetzen kann und es einwandfrei funktioniert? Wie kann ich dieses Problem lösen und den Parser erfolgreich erstellen? Für jede Hilfe oder jeden Einblick wären wir sehr dankbar.