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.
Überprüfen Sie die Grammatik und bauen Sie AST in AnltWorks auf. AST wird Ihnen helfen, Fehler zu finden. –
@ParthTrivedi Will, danke! Aber wissen Sie, was der genaue Fehler ist? Wir laufen etwas pünktlich. Arbeitet auch AntlrWorks an Eclipse? –
Ich denke {Klammern haben Problem in STRING –