ab. Ich lerne weiterhin PEG.js, bleibe aber bei der nächsten Ausgabe.Gleichen Sie das Zeichenfolgenliteral, das den Unterscope enthält, mit PEG.js
PEG.js generierten Parser nicht in der Lage String mit underscopes übereinstimmen: ohne sie
CONFIG += stl_off
aber erfolgreich analysieren die Zeichenfolge:
CONFIG += static
(dies ist eine integrierte -in Variable CONFIG
"Appending-Zuweisung" Anweisung, rvalue
ist eine Liste der begrenzten Menge o f Strings)
Was mache ich falsch?
Die Grammatik:
Start =
Statement* {return env; }
Statement
= Comment
/GenericAssignmentStatementT
GenericAssignmentStatementT = Whitespace* GenericAssignmentStatement Whitespace*
GenericAssignmentStatement
// TEMPLATE
= TemplateAssignmentStatement
// CONFIG
/ConfigAssignmentStatement
/ConfigAppendingAssignmentStatement
// -------------------------------------------------------------------------------------------------
// # Single-line comment
Comment "Comment string" = Whitespace* "#" rvalue:$(!LineBreak .)* LineBreak+ {
return "#" + rvalue;
}
// -------------------------------------------------------------------------------------------------
// TEMPLATE = app|lib|subdirs|aux|vcapp|vclib
SystemTemplateVariable = "TEMPLATE"
SystemTemplateVariableValue = "app"/"lib"/"subdirs"/"aux"/"vcapp"/"vclib"
TemplateAssignmentStatement = lvalue:SystemTemplateVariable AssignmentOperator rvalue:SystemTemplateVariableValue Whitespace* LineBreak* {
if (!env.qmakeVars)
env.qmakeVars = {};
env.qmakeVars[lvalue] = rvalue;
return {name:"TEMPLATE", op:"=", value:rvalue};
}
// -------------------------------------------------------------------------------------------------
// CONFIG = release|debug|debug_and_release|debug_and_release_target
SystemConfigVariable = "CONFIG"
SystemConfigVariableValue = "release"/"debug"/"debug_and_release"/"debug_and_release_target"
ConfigAssignmentStatement = lvalue:SystemConfigVariable AssignmentOperator rvalue:SystemConfigVariableValue? Whitespace* LineBreak* {
if (!env.qmakeVars)
env.qmakeVars = {};
env.qmakeVars[lvalue] = [rvalue];
return {name:"CONFIG", op:"=", value:rvalue};
}
ConfigAppendingAssignmentStatement = lvalue:SystemConfigVariable
AppendingAssignmentOperator rvalue:SystemConfigVariableValue Whitespace* LineBreak* {
if (!env.qmakeVars)
env.qmakeVars = {};
if (!env.qmakeVars[lvalue])
env.qmakeVars[lvalue] = [];
env.qmakeVars[lvalue].push(rvalue);
return {name:"CONFIG", op:"+=", value:rvalue};
}
// Assignment operators
AssignmentOperator = Whitespace* "=" Whitespace*
AppendingAssignmentOperator = Whitespace* "+=" Whitespace*
// Delimeters
LineBreak = [\r\n] {
return "LB";
}
Whitespace = [ \t] {
return "WS";
}
Testeingang:
TEMPLATE = app
CONFIG += debug_and_release
-Test PEG.js Ausgabe:
Line 2, column 16: Expected "CONFIG", "TEMPLATE", Comment string, [ \t], [\r\n], or end of input but "_" found.
Dank, es funktioniert! Aber das ist seltsam für mich - können Sie mich auf einen Artikel/Tutorial/Papier dort PEG.js Keyword-Matching beschrieben? – eraxillan
@eraxillan die Dokumentation states, für 'expression_1/expression_2/.../expression_n': _" Versuchen Sie, den ersten Ausdruck zu finden, wenn es nicht erfolgreich ist, versuchen Sie die zweite, etc. Das Ergebnis der ersten erfolgreich zurückgeben angepasster Ausdruck "_. Es prüft nicht, welches Literal mit _best_ übereinstimmt, es prüft, welches Literal _first_ entspricht. Ich nehme an, dass es nicht zurückgeht, wenn es den Rest anschließend nicht analysieren kann. – robertklep
Nochmals vielen Dank, Robert. Also muss ich nach dem "best practicies" -Dokument suchen oder einfach ein anderes Parser-Generierungs-Tool verwenden - meine Grammatik scheint zu kompliziert – eraxillan