2013-10-02 18 views
0

我必須聲明:爲什麼解析器拆分命令名稱到不同的節點

= MYFUNCTION_NAME(1,2,3)

我的語法是:

grammar Expression; 
options 
{ 
    language=CSharp3; 
    output=AST; 
    backtrack=true; 
} 
tokens 
{ 
    FUNC; 
    PARAMS; 
} 
@parser::namespace { Expression } 
@lexer::namespace { Expression } 

public 
parse  : ('=' func)*; 
func  : funcId '(' formalPar* ')' -> ^(FUNC funcId formalPar); 
formalPar : (par ',')* par -> ^(PARAMS par+); 
par  : INT; 
funcId : complexId+ ('_'? complexId+)*; 
complexId 
    : ID+ 
    | ID+DIGIT+  ; 
ID  : ('a'..'z'|'A'..'Z'|'а'..'я'|'А'..'Я')+; 
DIGIT  : ('0'..'9')+; 
INT  : '-'? ('0'..'9')+; 

在樹上,我得到:

 [**FUNC**] 
      | 
[MYFUNCTION] [_] [NAME] [**PARAMS**] 

爲什麼解析器分裂功能的名字進入3個節點:?「MyFunction的, 「_」, 「NAME」 我怎樣才能修復它

回答

0

除法總是基於令牌執行。由於ID令牌不能包含_字符,因此結果是3個單獨的令牌,稍後由funcId文法規則處理。要爲您的函數名稱創建單個節點,您需要創建一個詞法分析器規則,該規則可以將輸入MYFUNCTION_NAME作爲單個令牌進行匹配。

+0

我發現我可以使用單詞「片段」像片段DIGIT,片段ID – Medic