2017-05-28 6 views
1

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. 

Antwort

1

PEG wertet SystemConfigVariableValue von links nach rechts, so debug_and_release wird tatsächlich durch das release Literal verglichen (nach dem der Parser verwirrt wird).

Wenn Sie die speziellere wörtliche erste erklären, wird es funktionieren:

SystemConfigVariableValue = "debug_and_release_target"/"debug_and_release"/"release"/"debug" 
+0

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

+0

@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

+0

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

Verwandte Themen