PLY-Fehler: Symbol „NOT“ verwendet, aber nicht als Token oder Regel definiertPython

Python-Programme
Anonymous
 PLY-Fehler: Symbol „NOT“ verwendet, aber nicht als Token oder Regel definiert

Post by Anonymous »

Ich stoße auf ein Problem mit PLY (Python Lex-Yacc), bei dem ein Token im von mir definierten Parser nicht erkannt wird. Dieser Fehler verhindert, dass der Parser erstellt wird.
  • Ich verwende PLY 3.11 (die neueste Version, die auf PyPI verfügbar ist)
    < li>Ich verwende Python 3.13
Beim Versuch, den Parser zu erstellen, erhalte ich die folgende Fehlermeldung:

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
Hier ist der relevante Code für meinen Lexer:

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
Und hier ist der Code von meinem Parser, der den Fehler generiert:

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]})
Ich habe bestätigt, dass der Lexer die erwarteten Token erzeugt, wenn er separat auf einer Testeingabe ausgeführt wird.
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post