2009-05-20 2 views
1

Ich schreibe eine Grammatik für eine mittelgroße Sprache, und ich versuche, Zeitliterale des Formulars hh:mm:ss zu implementieren.ANTLR: Parsing 2-stellige Zahlen, wenn andere numerische Literale auch möglich sind

Allerdings, wenn ich versuche zu analysieren, zum Beispiel 12:34:56 als timeLiteral, bekomme ich nicht übereinstimmende Token-Ausnahmen auf den Ziffern. Weiß jemand, was ich falsch machen könnte?

Hier sind die einschlägigen Vorschriften, wie sie derzeit definiert:

timeLiteral 
    : timePair COLON timePair COLON timePair -> ^(TIMELIT timePair*) 
    ; 

timePair 
    : DecimalDigit DecimalDigit 
    ; 

NumericLiteral 
    : DecimalLiteral 
    ; 

fragment DecimalLiteral 
    : DecimalDigit+ ('.' DecimalDigit+)? 
    ; 

fragment DecimalDigit 
    : ('0'..'9') 
    ; 

Antwort

3

Das Problem ist, dass die Lexer die DecimalDigit ist gobbling und NumericLiteral zurück.

Der Parser wird DecimalDigits nie sehen, da es sich um eine Fragment-Regel handelt.

Ich würde empfehlen, timeLiteral in den Lexer (Großbuchstaben seinen Namen) zu verschieben. Also würden Sie so etwas wie

timeLiteral 
    : TimeLiteral -> ^(TIMELIT TimeLiteral*) 
    ; 

number 
    : DecimalLiteral 
    ; 

TimeLiteral 
    : DecimalDigit DecimalDigit COLON 
     DecimalDigit DecimalDigit COLON 
     DecimalDigit DecimalDigit 
    ; 

DecimalLiteral 
    : DecimalDigit+ ('.' DecimalDigit+)? 
    ; 

fragment DecimalDigit 
    : ('0'..'9') 
    ; 

Denken Sie daran haben, dass die Lexer und Parser völlig unabhängig sind. Der Lexer bestimmt, welche Token an den Parser übergeben werden, , dann, der Parser wird sie gruppieren.