antlr - What is wrong with this grammar? (ANTLRWorks 1.4) -
i have following code written in antlrworks 1.4
grammar hmm; s : (put_a_in_b)|(put_out_a)|(drop_kick)|(drop_a)|(put_on_a); put_a_in_b : (put_syn)(id)(in_syn)(id); put_out_a : (put2_syn)(out_syn)(id) | (e1)(id); drop_kick : ('drop')('kick')(id); drop_a : (drop_syn)(id); put_on_a : (e2)(id); put_syn : 'put' | 'place' | 'drop'; put2_syn : 'put' | 'douse'; in_syn : 'in' | 'into' | 'inside' | 'within'; out_syn : 'out'; e1 : 'extinguish'|'douse'; drop_syn : 'drop' | 'throw' | 'relinquish'; ws : ( ' ' | '\t' | '\r' | '\n' ) {$channel=hidden;}; id : ('a'..'z'|'a'..'z'|'_') ('a'..'z'|'a'..'z'|'0'..'9'|'_')*; e2 : 'put on'|'don'|'wear'; comment : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=hidden;} | '/*' ( options {greedy=false;} : . )* '*/' {$channel=hidden;} ;
when run input:
drop object
i mismatchedtokenexception(5 != 15).
and input :
put o1 in o2
i noviablealtexception.
though runs fine with
place o2 in o2
i'm new this, seems there's ambiguities? or maybe usage of antlr incorrect?
you've put 'drop'
, 'put'
in 2 different lexer-rules:
put_syn : 'put' | 'place' | 'drop'; // drop & put put2_syn : 'put' | 'douse'; // put ... drop_syn : 'drop' | 'throw' | 'relinquish'; // drop
when put
encountered lexer, put_syn
rule matches it, 'put'
(or should) removed put2_syn
rule.
so, problem parsing string drop object
: parser try match drop_a : (drop_syn)(id);
"drop"
matched in lexer rule put_syn
.
edit
those synonym-lists can better made parser rules (instead of lexer-rules). here's small demo:
grammar textadventure; parse : command (endcommand command)* eof ; command : put_syn_1 otherword in_syn otherword | put_syn_2 out_syn_1 otherword | out_syn_2 otherword | drop kick otherword | drop_syn otherword ; drop_syn : drop | throw | relinquish ; in_syn : in | | inside | within ; put_syn_1 : put | place | drop ; put_syn_2 : put | douse ; out_syn_1 : out ; out_syn_2 : extinguish | douse ; space : (' ' | '\t' | '\r' | '\n'){$channel=hidden;}; endcommand : ';'; put : 'put'; place : 'place'; drop : 'drop'; douse : 'douse'; in : 'in'; : 'into'; inside : 'inside'; within : 'within'; out : 'out'; extinguish : 'extinguish'; throw : 'throw'; relinquish : 'relinquish'; kick : 'kick'; otherword : ('a'..'z' | 'a'..'z')+;
when interpreting following source:
drop object ; put in myshoes ; place in avase
you'll see antlrworks generate following parse-tree:
Comments
Post a Comment