jikuaiarc项目构建,参考arc,把arc一直到antlr4,生成g4文件
生成antlr4 的g4文件
grammar Arc;@header {
import java.util.List;
import java.util.ArrayList;
}program: form* EOF;form: literal| list_form| vector| quoted| quasiquoted| unquoted| unquote_splicing| symbol;list_form: '(' form* ')'| special_form;special_form: def_form| mac_form| fn_form| if_form| quote_form| quasiquote_form| assign_form| do_form| let_form| with_form| withs_form| when_form| unless_form| while_form| for_form| each_form| repeat_form| loop_form| afn_form| rfn_form| compose_form| complement_form| andf_form| orf_form| and_form| or_form;def_form: '(' DEF symbol form+ ')';
mac_form: '(' MAC symbol form+ ')';
fn_form: '(' FN form_list form+ ')';
if_form: '(' IF form form form? ')';
quote_form: '(' QUOTE form ')';
quasiquote_form: '(' QUASIQUOTE form ')';
assign_form: '(' ASSIGN symbol form ')';
do_form: '(' DO form* ')';
let_form: '(' LET symbol form form+ ')';
with_form: '(' WITH binding_list form+ ')';
withs_form: '(' WITHS binding_list form+ ')';
when_form: '(' WHEN form form+ ')';
unless_form: '(' UNLESS form form+ ')';
while_form: '(' WHILE form form+ ')';
for_form: '(' FOR symbol form form form+ ')';
each_form: '(' EACH symbol form form+ ')';
repeat_form: '(' REPEAT form form+ ')';
loop_form: '(' LOOP form form form form+ ')';
afn_form: '(' AFN form_list form+ ')';
rfn_form: '(' RFN symbol form_list form+ ')';
compose_form: '(' COMPOSE form+ ')';
complement_form: '(' COMPLEMENT form ')';
andf_form: '(' ANDF form+ ')';
orf_form: '(' ORF form+ ')';
and_form: '(' AND form+ ')';
or_form: '(' OR form+ ')';binding_list: '(' (symbol form)* ')';
form_list: '(' symbol* ')';literal: NUMBER| STRING| CHARACTER| BOOLEAN| NIL;vector: '[' form* ']';
quoted: '\'' form;
quasiquoted: '`' form;
unquoted: ',' form;
unquote_splicing: ',@' form;symbol: SYMBOL;// Lexer rules
NUMBER: '-'? [0-9]+ ('.' [0-9]+)? ([eE] [+-]? [0-9]+)?;
STRING: '"' (~["\\] | '\\' .)* '"';
CHARACTER: '#\\' .;
BOOLEAN: '#t' | '#f';
NIL: 'nil';SYMBOL: [a-zA-Z!$%&*+/:<=>?@^_~-] [a-zA-Z0-9!$%&*+/:<=>?@^_~-]*;// Special syntax symbols
DEF: 'def';
MAC: 'mac';
FN: 'fn';
IF: 'if';
QUOTE: 'quote';
QUASIQUOTE: 'quasiquote';
ASSIGN: 'assign';
DO: 'do';
LET: 'let';
WITH: 'with';
WITHS: 'withs';
WHEN: 'when';
UNLESS: 'unless';
WHILE: 'while';
FOR: 'for';
EACH: 'each';
REPEAT: 'repeat';
LOOP: 'loop';
AFN: 'afn';
RFN: 'rfn';
COMPOSE: 'compose';
COMPLEMENT: 'complement';
ANDF: 'andf';
ORF: 'orf';
AND: 'and';
OR: 'or';// Whitespace and comments
WS: [ \t\r\n]+ -> skip;
COMMENT: ';' ~[\r\n]* -> skip;// Special characters
LPAREN: '(';
RPAREN: ')';
LBRACK: '[';
RBRACK: ']';
QUOTE_CHAR: '\'';
BACKQUOTE: '`';
COMMA: ',';
COMMA_AT: ',@';
使用解析器
# 生成解析器
java -cp antlr-4.9.2-complete.jar org.antlr.v4.Tool -o .antlr Arc.g4# 编译
javac -cp antlr-4.9.2-complete.jar .antlr/*.java
javac -cp ".;.antlr;antlr-4.9.2-complete.jar" TestArc.java# 运行测试
java -cp ".;.antlr;antlr-4.9.2-complete.jar" TestArc
输出:
(TraeAI-3) G:\work\jikuaiarc [1:1] $ java -cp antlr-4.9.2-complete.jar org.antlr.v4.Tool -o .antlr Arc.g4
(TraeAI-3) G:\work\jikuaiarc [0:0] $ javac -cp antlr-4.9.2-complete.jar .antlr/*.java
(TraeAI-3) G:\work\jikuaiarc [0:0] $ javac -cp ".;.antlr;antlr-4.9.2-complete.jar" TestArc.java
(TraeAI-3) G:\work\jikuaiarc [0:0] $ java -cp ".;.antlr;antlr-4.9.2-complete.jar" TestArc
line 12:16 token recognition error at: '.'
Parse tree:
(program (form (list_form ( (form (symbol def)) (form (symbol factorial)) (form
(list_form ( (form (symbol n)) ))) (form (list_form ( (form (symbol if)) (form (list_form ( (form (symbol <=)) (form (symbol n)) (form (literal 1)) ))) (form (literal 1)) (form (list_form ( (form (symbol *)) (form (symbol n)) (form (list_form ( (form (symbol factorial)) (form (list_form ( (form (symbol -)) (form (symbol n)) (form (literal 1)) ))) ))) ))) ))) ))) (form (list_form ( (form (symbol def)) (form (symbol fib)) (form (list_form ( (form (symbol n)) ))) (form (list_form ( (form (symbol if)) (form (list_form ( (form (symbol <)) (form (symbol n)) (form (literal 2)) ))) (form (symbol n)) (form (list_form ( (form (symbol +)) (form (list_form ( (form (symbol fib)) (form (list_form ( (form (symbol -)) (form (symbol n)) (form (literal 1)) ))) ))) (form (list_form ( (form (symbol fib)) (form (list_form ( (form (symbol -)) (form (symbol n)) (form (literal 2)) ))) ))) ))) ))) ))) (form (list_form ( (form (symbol mac)) (form (symbol when)) (form (list_form ( (form (symbol test)) (form (symbol body)) ))) (form (quasiquoted ` (form (list_form ( (form (symbol if)) (form (unquoted , (form (symbol test)))) (form (list_form ( (form (symbol do)) (form (unquote_splicing ,@ (form (symbol body)))) ))) ))))) ))) (form (list_form ( (form (symbol let)) (form (symbol x)) (form
(literal 10)) (form (list_form ( (form (symbol when)) (form (list_form ( (form (symbol >)) (form (symbol x)) (form (literal 5)) ))) (form (list_form ( (form (symbol prn)) (form (literal "x is greater than 5")) ))) ))) ))) (form (list_form ( (form (symbol each)) (form (symbol x)) (form (quoted ' (form (list_form ( (form (literal 1)) (form (literal 2)) (form (literal 3)) (form (literal 4)) (form (literal 5)) ))))) (form (list_form ( (form (symbol prn)) (form (literal "Number: ")) (form (symbol x)) ))) ))) (form (list_form ( (form (symbol prn)) (form (literal "Factorial of 5: ")) (form (list_form ( (form (symbol factorial)) (form (literal 5)) ))) ))) (form (list_form ( (form (symbol prn)) (form (literal "Fibonacci of 10: ")) (form (list_form ( (form (symbol fib)) (form (literal 10)) ))) ))) <EOF>)Tokens:
LPAREN '('
SYMBOL 'def'
SYMBOL 'factorial'
LPAREN '('
SYMBOL 'n'
RPAREN ')'
LPAREN '('
SYMBOL 'if'
LPAREN '('
SYMBOL '<='
SYMBOL 'n'
NUMBER '1'
RPAREN ')'
NUMBER '1'
LPAREN '('
SYMBOL '*'
SYMBOL 'n'
LPAREN '('
SYMBOL 'factorial'
LPAREN '('
SYMBOL '-'
SYMBOL 'n'
NUMBER '1'
RPAREN ')'
RPAREN ')'
RPAREN ')'
RPAREN ')'
RPAREN ')'
LPAREN '('
SYMBOL 'def'
SYMBOL 'fib'
LPAREN '('
SYMBOL 'n'
RPAREN ')'
LPAREN '('
SYMBOL 'if'
LPAREN '('
SYMBOL '<'
SYMBOL 'n'
NUMBER '2'
RPAREN ')'
SYMBOL 'n'
LPAREN '('
SYMBOL '+'
LPAREN '('
SYMBOL 'fib'
LPAREN '('
SYMBOL '-'
SYMBOL 'n'
NUMBER '1'
RPAREN ')'
RPAREN ')'
LPAREN '('
SYMBOL 'fib'
LPAREN '('
SYMBOL '-'
SYMBOL 'n'
NUMBER '2'
RPAREN ')'
RPAREN ')'
RPAREN ')'
RPAREN ')'
RPAREN ')'
LPAREN '('
SYMBOL 'mac'
SYMBOL 'when'
LPAREN '('
SYMBOL 'test'
SYMBOL 'body'
RPAREN ')'
BACKQUOTE '`'
LPAREN '('
SYMBOL 'if'
COMMA ','
SYMBOL 'test'
LPAREN '('
SYMBOL 'do'
COMMA_AT ',@'
SYMBOL 'body'
RPAREN ')'
RPAREN ')'
RPAREN ')'
LPAREN '('
SYMBOL 'let'
SYMBOL 'x'
NUMBER '10'
LPAREN '('
SYMBOL 'when'
LPAREN '('
SYMBOL '>'
SYMBOL 'x'
NUMBER '5'
RPAREN ')'
LPAREN '('
SYMBOL 'prn'
STRING '"x is greater than 5"'
RPAREN ')'
RPAREN ')'
RPAREN ')'
LPAREN '('
SYMBOL 'each'
SYMBOL 'x'
QUOTE_CHAR '''
LPAREN '('
NUMBER '1'
NUMBER '2'
NUMBER '3'
NUMBER '4'
NUMBER '5'
RPAREN ')'
LPAREN '('
SYMBOL 'prn'
STRING '"Number: "'
SYMBOL 'x'
RPAREN ')'
RPAREN ')'
LPAREN '('
SYMBOL 'prn'
STRING '"Factorial of 5: "'
LPAREN '('
SYMBOL 'factorial'
NUMBER '5'
RPAREN ')'
RPAREN ')'
LPAREN '('
SYMBOL 'prn'
STRING '"Fibonacci of 10: "'
LPAREN '('
SYMBOL 'fib'
NUMBER '10'
RPAREN ')'
RPAREN ')'
EOF '<EOF>'