2016-05-23 13 views
0

Ich weiß, dass es viele dieser Fragen gibt und wir haben sie alle durchgegangen, aber wir scheinen keine Lösung zu finden, die unseren Bedürfnissen entspricht.ANTLR: Kein brauchbarer alternativer Fehler '{"type' ''

Wir haben eine einfache Grammatik für einen JavaScript-zu-Java-Konverter, den Lexer und den Parser geschrieben, und wir können es nicht dazu bringen, das erste Token unserer Eingabedatei korrekt zu konsumieren.

Hier ist die Grammatik:

lexer grammar JS2JAVALexer; 

STRING 
    : '"' (ESC | ~ ["\\])* '"' 
    ; 
fragment ESC 
    : '\\' (["\\/bfnrt] | UNICODE) 
    ; 
fragment UNICODE 
    : 'u' HEX HEX HEX HEX 
    ; 
fragment HEX 
    : [0-9a-fA-F] 
    ; 
NUMBER 
    : '-'? INT '.' [0-9] + EXP? | '-'? INT EXP | '-'? INT 
    ; 
fragment INT 
    : '0' | [1-9] [0-9]* 
    ; 
// no leading zeros 
fragment EXP 
    : [Ee] [+\-]? INT 
    ; 
// \- since - means "range" inside [...] 
WS 
    : [ \t\n\r] + -> skip 
    ; 

OPENPAR : '(' ; 
CLOSEPAR : ')' ; 
OPENBRACES : '{' ; 
CLOSEBRACES : '}' ; 
OPENBRACKETS : '[' ; 
CLOSEBRACKETS : ']' ; 
TWOPOINTS : ':' ; 
QUOTATION_MARK : '"'; 
COMMA : ',' ; 
TRUE : 'true'; 

FALSE : 'false'; 
NULL : 'null' ; 

TYPE : 'type'; 
SOURCETYPE : '"sourceType"'; 
BODY : '"body"'; 

Nach dem Ausführen wir den Fehler „Zeile 2: 4 keine brauchbare Alternative am Eingang bekommen '{ "type"'

Diese unsere Eingabedatei:

{ 
    "type": "Program", 
    "body": [ 
     { 
      "type": "FunctionDeclaration", 
      "id": { 
       "type": "Identifier", 
       "name": "name" 
      }, 
      "params": [ 
       { 
        "type": "Identifier", 
        "name": "arg1" 
       }, 
       { 
        "type": "Identifier", 
        "name": "arg2" 
       } 
      ], 
      "defaults": [], 
      "body": { 
       "type": "BlockStatement", 
       "body": [ 
        { 
         "type": "VariableDeclaration", 
         "declarations": [ 
          { 
           "type": "VariableDeclarator", 
           "id": { 
            "type": "Identifier", 
            "name": "x" 
           }, 
           "init": { 
            "type": "Literal", 
            "value": 1, 
            "raw": "1" 
           } 
          } 
         ], 
         "kind": "var" 
        }, 
        { 
         "type": "VariableDeclaration", 
         "declarations": [ 
          { 
           "type": "VariableDeclarator", 
           "id": { 
            "type": "Identifier", 
            "name": "y" 
           }, 
           "init": { 
            "type": "Literal", 
            "value": 2, 
            "raw": "2" 
           } 
          } 
         ], 
         "kind": "var" 
        }, 
        { 
         "type": "ReturnStatement", 
         "argument": { 
          "type": "BinaryExpression", 
          "operator": "+", 
          "left": { 
           "type": "Identifier", 
           "name": "x" 
          }, 
          "right": { 
           "type": "Identifier", 
           "name": "y" 
          } 
         } 
        } 
       ] 
      }, 
      "generator": false, 
      "expression": false 
     } 
    ], 
    "sourceType": "script" 
} 

Parser Code:

parser grammar JS2JAVAParser; 

options { 
    tokenVocab = JS2JAVALexer; 
} 

json 
    : object 
    | array 
    ; 

object 
    : OPENBRACES pair (COMMA pair)* CLOSEBRACES 
    | OPENBRACES CLOSEBRACES 
    ; 

left_operand 
    : QUOTATION_MARK left_name QUOTATION_MARK 
    ; 

left_name 
    : TYPE 
    | BODY 
    | SOURCETYPE 
    | DECLARATIONS 
    | ID 
    | INIT 
    | OPERATOR 
    | LEFT 
    | RIGHT 
    | VALUE 
    | RAW 
    | KIND 
    ; 

pair 
    : left_operand TWOPOINTS value 
    ; 

array 
    : OPENBRACKETS value (COMMA value)* CLOSEBRACKETS 
    | OPENBRACKETS CLOSEBRACKETS 
    ; 

value 
    : QUOTATION_MARK value_name QUOTATION_MARK 
    | object 
    | array 
    | TRUE 
    | FALSE 
    | NULL 
    | STRING 
    | IDENTIFIER 
    | LITERAL 
    | VAR 
    | STRING 
    ; 

value_name 
    : SCRIPT 
    | PROGRAM 
    ; 

Entschuldigung für solch eine lange und sich wiederholende Frage, aber wir haben keine Ideen mehr. Vielen Dank im Voraus für Ihre Geduld Jungs.

+0

Überprüfen Sie die Grammatik und bauen Sie AST in AnltWorks auf. AST wird Ihnen helfen, Fehler zu finden. –

+0

@ParthTrivedi Will, danke! Aber wissen Sie, was der genaue Fehler ist? Wir laufen etwas pünktlich. Arbeitet auch AntlrWorks an Eclipse? –

+0

Ich denke {Klammern haben Problem in STRING –

Antwort

0

Das Problem ist, dass in Ihrer Top-Level-Parser-Regel "Typ" als STRING-Token erkannt wird. Tatsächlich scheint alles, was STRING oder etwas anderes sein könnte, als STRING erkannt zu werden. Im Grunde müssen Sie die Lexikermehrdeutigkeit auflösen. Durch Umschreiben von Lexer-Regeln oder möglicherweise durch Verwendung von Lexer-Modi.

Auch mindestens als Referenz gibt es this JSON grammar auf ANTLR Github Repo.