2016-06-01 10 views
0

Ich habe folgende Grammatik in ANTLR4ANTLR4 Grammatik Ausgabe

grammar DEF; 

def 
: 
    'DEF' vartypes ID ';' 
; 

ID 
: 
    (
     'A' .. 'Z'|'a'..'z' 
    )+ 
; 

vartypes 
: 
    INT 
    | REAL 
; 

INT:'INT'; 
REAL:'REAL'; 

VARIABLE 
: 
    (
     'A' .. 'Z' 
     | 'a' .. 'z' 
     | '0' .. '9' 
     | '_' 
     | '-' 
    )+ 
; 

fragment VARTYPEREAL 
: 
    'REAL' 
; 

fragment VARTYPEINT 
: 
    'INT' 
; 

LINENUMBER 
: 
    'N' INTVALUE 
; 

INTVALUE 
: 
    (
     '-' 
    )? 
    (
     '0' .. '9' 
    )+ 
; 

WS 
: 
    (
     ' ' 
     | '\t' 
     | '\n' 
     | '\r' 
    )+ -> skip 
; 

Und wenn ich analysieren die Zeichenfolge 'DEF REAL-Test;' Ich erhalte den folgenden Fehler:

line 1:4 missing {'INT', 'REAL'} at 'REAL' 

Zeile 1: 9 Fremdeingang 'Test' erwartet ';'

Aber, wenn ich meine Grammatik

grammar DEF; 

def 
: 
    'DEF' vartypes ID ';' 
; 

ID 
: 
    (
     'A' .. 'Z'|'a'..'z' 
    )+ 
; 

vartypes 
: 
    'INT' 
    | 'REAL' 
; 

VARIABLE 
: 
    (
     'A' .. 'Z' 
     | 'a' .. 'z' 
     | '0' .. '9' 
     | '_' 
     | '-' 
    )+ 
; 

fragment VARTYPEREAL 
: 
    'REAL' 
; 

fragment VARTYPEINT 
: 
    'INT' 
; 

LINENUMBER 
: 
    'N' INTVALUE 
; 

INTVALUE 
: 
    (
     '-' 
    )? 
    (
     '0' .. '9' 
    )+ 
; 

WS 
: 
    (
     ' ' 
     | '\t' 
     | '\n' 
     | '\r' 
    )+ -> skip 
; 

alles

ändern ist in Ordnung. Wo liege ich in der Grammatik 1 falsch?

+0

Als Kommentar ist es nicht einfach, den Unterschied zwischen Ihren Grammatiken zu erkennen. Um zu vermeiden, dass die Stimmen beim nächsten Mal geschlossen werden, beschreiben Sie, was genau Sie geändert haben. – doublep

Antwort

0

In Ihren ersten Grammatik INT und REAL Regeln kommen nach ID, so strings "INT" und "REAL" mit ID Regel abgestimmt ist. In Ihrer zweiten Grammatik verwenden Sie stattdessen Zeichenfolgen, die (in gemischten Grammatiken wie Sie) implizite Lexer-Regeln erzeugen, die Vorrang vor den expliziten Regeln haben.

zu beheben die erste Grammatik INT und REAL oben ID Regel bewegen.