我一次又一次地跑到這裏。爲了解析{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'
;
我不明白爲什麼,但我得到一個NoViableAltException
說line x:y no viable alternative at input 'SB0'
。
任何人都可以解釋爲什麼會發生這種情況嗎?解析器規則type_dcl_id
在每個選項前面都有獨特的文字。我不明白爲什麼解析器在這一點上會遇到麻煩。
我添加了所有詞法分析規則。
旁註:
爲什麼我想要的粒度,而不是簡單的解析了該輸入的是,我想type_dcl_id
後來返回其將被傳播到type_chain_record
,後來被用來構造對象的理由另一個對象ChainRecord
,它將持有一個對象DCLType
。
'EXPRESSION'可以是'DIGIT','LETTER'或'_'這樣的imho,它應該解析'SB0 $ 1'。 – displayname
當我*回答*時,SB0必須跟隨另一個表達式。你的語法不允許孤立SB0。 –
@TheantLRGuy然後我不明白。 '0'可以是'EXPRESSION',那麼爲什麼它不會將'0'識別爲表達式後跟'$ EXPRESSION'? – displayname