我試圖學習語言解析的樂趣...如何在ANTLR3中製作TreeParser?
我創建了一個ANTLR語法,我相信會匹配一個簡單的語言,我希望實現。這將有以下語法:
<FunctionName> (<OptionalArguments>+) {
<OptionalChildFunctions>+
}
實際的例子:
ForEach(in:[1,2,3,4,5] as:"nextNumber") {
Print(message:{nextNumber})
}
我相信我有語法正確的工作,以配合這個結構,現在我attemping建立一個抽象語法樹爲語言。
首先,我必須承認我不完全確定這棵樹應該如何看。其次,我完全喪失瞭如何在Antlr語法中做到這一點......我幾個小時一直在努力嘗試。
這是我現在的想法 - 請和我一起裸照! :)
FunctionName
/ \
Attributes \
/\ /\
ID /\ ChildFunctions
/\ ID etc
/ \
Attribute AttributeValue
Type
這是我目前ANTLR的語法文件:
grammar Test;
options {output=AST;ASTLabelType=CommonTree;}
program : function ;
function : ID (OPEN_BRACKET (attribute (COMMA? attribute)*)? CLOSE_BRACKET)? (OPEN_BRACE function* CLOSE_BRACE)?;
attribute : ID COLON datatype;
datatype : NUMBER | STRING | BOOLEAN | array | lookup ;
array : OPEN_BOX (datatype (COMMA datatype)*)? CLOSE_BOX ;
lookup : OPEN_BRACE (ID (PERIOD ID)*) CLOSE_BRACE;
NUMBER
: ('+' | '-')? (INTEGER | FLOAT)
;
STRING
: '"' (ESC_SEQ | ~('\\'|'"'))* '"'
;
BOOLEAN
: 'true' | 'TRUE' | 'false' | 'FALSE'
;
ID : (LETTER|'_') (LETTER | INTEGER |'_')*
;
COMMENT
: '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
| '/*' (options {greedy=false;} : .)* '*/' {$channel=HIDDEN;}
;
WHITESPACE : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} ;
COLON : ':' ;
COMMA : ',' ;
PERIOD : '.' ;
OPEN_BRACKET : '(' ;
CLOSE_BRACKET : ')' ;
OPEN_BRACE : '{' ;
CLOSE_BRACE : '}' ;
OPEN_BOX : '[' ;
CLOSE_BOX : ']' ;
fragment
LETTER
: 'a'..'z' | 'A'..'Z'
;
fragment
INTEGER
: '0'..'9'+
;
fragment
FLOAT
: INTEGER+ '.' INTEGER*
;
fragment
ESC_SEQ
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
;
任何幫助/建議將是巨大的。我嘗試閱讀幾十個教程,但沒有任何關於AST一代似乎堅持:(
這是我害怕的部分,我害怕。我讀過樹構建頁面,並沒有真正理解它:( – 2010-01-14 00:28:30
感謝您的編輯,這增加了很多有用的信息。 – 2010-01-24 16:03:52
真正偉大的解釋。我也用ANTLR一個初學者,我認爲該網站是在某種程度上以某種方式告訴您買的書感謝 – INS 2010-02-10 12:29:42