2014-06-05 36 views
1

我一次又一次地跑到這裏。爲了解析{1}SB0$1:U insied此輸入S:G$mabit$0$0({1}SB0$1:U),H,0,0我這裏有下列規則:ANTLR NoViableAltException

/* 
* Type Chain Record 
*/ 

type_chain_record 
    : 
    '{' number[10] '}' type_dcl_id (',' type_dcl_id)? ':' type_sign 
    ; 

type_dcl_id 
    : 
     'DA' EXPRESSION 'd'     // Array of n elements 
    | 'DF'          // Function 
    | 'DG'          // Generic pointer 
    | 'DC'          // Code pointer 
    | 'DX'          // External ram pointer 
    | 'DD'          // Internal ram pointer 
    | 'DP'          // Page pointer 
    | 'DI'          // Upper 128 byte pointer 
    | 'SL'          // long 
    | 'SI'          // int 
    | 'SC'          // char 
    | 'SS'          // short 
    | 'SV'          // void 
    | 'SF'          // float 
    | 'ST' EXPRESSION     // Structure of name <name> 
    | 'SX'          // sbit 
    | 'SB' EXPRESSION '$' EXPRESSION // Bit field of n bits 
    ; 

type_sign 
    : 
     'U' // Unsigned 
    | 'S' // Signed 
    ; 


number[int numbase] returns[long val] 
    : 
    n = EXPRESSION 
    { 
     $val = Convert.ToInt64($n.text, $numbase); 
    } 
    ; 


// //////////////////////////////////////////////////////////////////////////// 
// LEXER RULES 

fragment LETTER 
    : 
     'a'..'z' 
    | 'A'..'Z' 
    ; 

fragment DIGIT 
    : 
    '0'..'9' 
    ; 

fragment NONZERO_DIGIT 
    : 
    '1'..'9' 
    ; 


FILE_SCOPE 
    : 
    'L' (LETTER)+ '.' (LETTER)+ 
    ; 

EXPRESSION 
    : 
    (LETTER | DIGIT | '_')+ 
    ; 

WS 
    : 
    '\r' | '\n' 
    ; 

我不明白爲什麼,但我得到一個NoViableAltExceptionline x:y no viable alternative at input 'SB0'

任何人都可以解釋爲什麼會發生這種情況嗎?解析器規則type_dcl_id在每個選項前面都有獨特的文字。我不明白爲什麼解析器在這一點上會遇到麻煩。

我添加了所有詞法分析規則。

旁註:

爲什麼我想要的粒度,而不是簡單的解析了該輸入的是,我想type_dcl_id後來返回其將被傳播到type_chain_record,後來被用來構造對象的理由另一個對象ChainRecord,它將持有一個對象DCLType

回答

1

SB0得到標記爲EXPRESSION,因爲詞法分析器將匹配最長的可能序列,明顯SB0SB長。

一個簡單的解決辦法是讓LETTERDIGIT真正的詞法規則,而不是片段,並通過了以下新的解析器規則交換EXPRESSION詞法規則:

expression : (LETTER | DIGIT | '_')+ ; 

欲瞭解更多信息,你可能會發現這篇文章有幫助: https://github.com/antlr/antlr4/issues/485#issuecomment-37284837

1

| 'SB' EXPRESSION '$' EXPRESSION // Bit field of n bits

不匹配SBO。

+0

'EXPRESSION'可以是'DIGIT','LETTER'或'_'這樣的imho,它應該解析'SB0 $ 1'。 – displayname

+0

當我*回答*時,SB0必須跟隨另一個表達式。你的語法不允許孤立SB0。 –

+0

@TheantLRGuy然後我不明白。 '0'可以是'EXPRESSION',那麼爲什麼它不會將'0'識別爲表達式後跟'$ EXPRESSION'? – displayname