Ist es möglich zu verstehen, wann funktionieren semantische Prädikate und wann nicht?
Posted: 22 Feb 2025, 01:30
unten sind zwei Grammatiken. < /p>
In dieser Grammatik machen semantische Prädikate "Arbeit". D.h. Wenn sie falsch sind, stimmen Regeln nicht überein und wenn sie wahr sind, stimmen die Regeln überein: < /p>
expr
: term
| expr asterisk expr (asterisk expr)*
| expr plus expr (plus expr)*
;
plus: {_input.LT(1).getText().equals("+")}? SPECID;
asterisk: {_input.LT(1).getText().equals("*")}? SPECID;
term
: ALNUMID
| STRID
| LPAREN expr RPAREN
;
< /code>
Und in dieser Grammatik funktionieren semantische Prädikate nicht. D.h. Wenn sie falsch sind, werden die Regeln immer noch mit dem BU -Fehler übereinstimmen. < /p>
expr
: add
| mult
| term
;
mult
: term (asterisk) term ((asterisk) term)*
;
add
: (term|mult) plus (term|mult) (plus (term|mult))*
;
plus: {_input.LT(1).getText().equals("+")}? SPECID;
asterisk: {_input.LT(1).getText().equals("*")}? SPECID;
term
: ALNUMID
| STRID
| LPAREN expr RPAREN
;
< /code>
In beiden Fällen versuche ich einfache Tests durchzuführen, um 2 + 2 und 2 * 2 zu analysieren. Definitionsarbeit oder nicht? Was ist die Logik hier?
In dieser Grammatik machen semantische Prädikate "Arbeit". D.h. Wenn sie falsch sind, stimmen Regeln nicht überein und wenn sie wahr sind, stimmen die Regeln überein: < /p>
expr
: term
| expr asterisk expr (asterisk expr)*
| expr plus expr (plus expr)*
;
plus: {_input.LT(1).getText().equals("+")}? SPECID;
asterisk: {_input.LT(1).getText().equals("*")}? SPECID;
term
: ALNUMID
| STRID
| LPAREN expr RPAREN
;
< /code>
Und in dieser Grammatik funktionieren semantische Prädikate nicht. D.h. Wenn sie falsch sind, werden die Regeln immer noch mit dem BU -Fehler übereinstimmen. < /p>
expr
: add
| mult
| term
;
mult
: term (asterisk) term ((asterisk) term)*
;
add
: (term|mult) plus (term|mult) (plus (term|mult))*
;
plus: {_input.LT(1).getText().equals("+")}? SPECID;
asterisk: {_input.LT(1).getText().equals("*")}? SPECID;
term
: ALNUMID
| STRID
| LPAREN expr RPAREN
;
< /code>
In beiden Fällen versuche ich einfache Tests durchzuführen, um 2 + 2 und 2 * 2 zu analysieren. Definitionsarbeit oder nicht? Was ist die Logik hier?