2016-03-23 20 views
3

Ich versuche, eine reine Lexer-Grammatik in Antlr zu definieren, die 32-Bit in hexadezimaler Schreibweise erkennt.Wie definiert man eine Regel eines Musters mit einer festen Anzahl von Wiederholungen mit Antlr reinen Lexer Grammatik

für jetzt habe ich:

lexer grammar Grammar; 

WS : [ \r\t\n]+ -> skip; 

fragment HexDigit : ([0-9]|[A-f]|[a-f]); 
fragment HexDigitNoZero : ([1-9]|[A-f]|[a-f]); 
fragment HexNumber : (HexDigitNoZero)(HexDigit)*; 
fragment Eight : HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit; 

Hex :'0x'Eight; 

ich Theres wissen möchten, wenn irgendeine Art und Weise eine Reihe 8 in einer reinen Lexer Grammatik zu definieren. Wie Flex mit 'a' {8}.

Antwort

1

Sie könnten ein Prädikat verwenden (wie bei Aktion hat aber ? am Ende)

(HexDigitNoZero)(HexDigit)* {getText().lenght!= 8}? {do_something;}; 

Tecnhically das ist reine Lexer, nutzt aber gramar Aktionen

+0

Thx für die Beratung: Ich habe Hex: {getText() .length() == 8}? '0x' (HexDigitNoZero) (HexDigit) *; und es hat perfekt funktioniert. –

+0

Gern geschehen. Wenn Sie die Antwort akzeptieren könnten, wäre das geat. :) – cantSleepNow