Ich versuche, Grammatik für GNU MathProg Sprache aus Glpk-Paket zu erstellen https://www3.nd.edu/~jeff/mathprog/glpk-4.47/doc/gmpl.pdf
Leider Grammatik, die ich bisher geschrieben habe, ist mehrdeutig. Ich kann Bison nicht sagen, welcher Ast des Parsing-Baums korrekt ist, wenn ein Bezeichner verwendet wird. Zum Beispiel:Kann nicht herausfinden, wie zu beheben, reduzieren/reduzieren Konflikt
numericExpression : numericLiteral
| identifier
| numericFunctionReference
| iteratedNumericExpression
| conditionalNumericExpression
| '(' numericExpression ')' %prec PARENTH
| '-' numericExpression %prec UNARY
| '+' numericExpression %prec UNARY
| numericExpression binaryArithmeticOperator numericExpression
;
symbolicExpression : stringLiteral
| symbolicFunctionReference
| identifier
| conditionalSymbolicExpression
| '(' symbolicExpression ')' %prec PARENTH
| symbolicExpression '&' symbolicExpression
;
indexingExpression : '{' indexingEntries '}'
| '{' indexingEntries ':' logicalExpression '}'
;
setExpression : literalSet
| identifier
| aritmeticSet
| indexingExpression
| iteratedSetExpression
| conditionalSetExpression
| '(' setExpression ')' %prec PARENTH
| setExpression setOperator setExpression
;
numericLiteral : INT
| FLT
;
linearExpression : identifier
| iteratedLinearExpression
| conditionalLinearExpression
| '(' linearExpression ')' %prec PARENTH
| '-' linearExpression %prec UNARY
| '+' linearExpression %prec UNARY
| linearExpression '+' linearExpression
| linearExpression '-' linearExpression
| linearExpression '*' numericExpression
| numericExpression '*' linearExpression
| linearExpression '/' numericExpression
;
logicalExpression : numericExpression
| relationalExpression
| iteratedLogicalExpression
| '(' logicalExpression ')' %prec PARENTH
| NOT logicalExpression %prec NEG
| logicalExpression AND logicalExpression
| logicalExpression OR logicalExpression
;
identifier : SYMBOLIC_NAME
| SYMBOLIC_NAME '[' listOfIndices ']'
;
listOfIndices : SYMBOLIC_NAME
| listOfIndices ',' SYMBOLIC_NAME
;
Kennung ist einfach der Name 'Variable'. Die Variable hat einen bestimmten Typ (Parameter, Menge, Entscheidungsvariable) und kann indexiert werden. Im Code muss der Programmierer den Variablentyp in Anweisungen wie zB deklarieren.
param p1;
param p2{1, 2} >=0;
set s1;
set s2{i in 1..5};
var v1 >=0;
var v2{S1,S2};
Aber wenn Bison sieht Kennung nicht weiß, welche Regel verwendet werden soll, und ich bin immer verringern/verringern Konflikte wie
113 numericExpression: identifier .
123 symbolicExpression: identifier .
'&' reduce using rule 123 (symbolicExpression)
ELSE reduce using rule 113 (numericExpression)
ELSE [reduce using rule 123 (symbolicExpression)]
INTEGER reduce using rule 113 (numericExpression)
INTEGER [reduce using rule 123 (symbolicExpression)]
BINARY reduce using rule 113 (numericExpression)
BINARY [reduce using rule 123 (symbolicExpression)]
ASIGN reduce using rule 113 (numericExpression)
ASIGN [reduce using rule 123 (symbolicExpression)]
',' reduce using rule 113 (numericExpression)
',' [reduce using rule 123 (symbolicExpression)]
'>' reduce using rule 113 (numericExpression)
'>' [reduce using rule 123 (symbolicExpression)]
'}' reduce using rule 113 (numericExpression)
'}' [reduce using rule 123 (symbolicExpression)]
113 numericExpression: identifier .
123 symbolicExpression: identifier .
130 setExpression: identifier .
UNION reduce using rule 130 (setExpression)
DIFF reduce using rule 130 (setExpression)
SYMDIFF reduce using rule 130 (setExpression)
ELSE reduce using rule 113 (numericExpression)
ELSE [reduce using rule 123 (symbolicExpression)]
ELSE [reduce using rule 130 (setExpression)]
WITHIN reduce using rule 130 (setExpression)
IN reduce using rule 113 (numericExpression)
IN [reduce using rule 123 (symbolicExpression)]
Ich habe auch andere Probleme, aber dieses ist Blocker für mich
Können Sie auch Ihren Parser zeigen? Ich versuche, Ihre Grammatik durchzulesen und suche weiter nach "param" "var" strings – aec
Hier ist die komplette Bison-Datei. Beachten Sie, dass es noch nicht fertig ist. Es fehlen einige Operatoren und einige tabellarische Regeln. http://wklej.org/id/2370457/ – Lisu
Ich habe das Gefühl, dass ich mich bei Ausdrücken semantisch verzweige und nicht kategorisch dazu tendiere, Probleme wie diese zu erzeugen. Wäre es nicht ausreichend, zB "numericExpression" und "logicalExpression" zu haben? beide bewerten oft dasselbe: "Ausdruck". Sie verwenden diese spezifischeren Ausdrücke zur Validierung. – aec