[antlr-interest] Why does antlr not know alternative?
James Ladd
james_ladd at hotmail.com
Tue Jan 10 13:39:52 PST 2012
>> All of the above is just speculation since you did not supply a grammar
> that i could actually run
Huh - the grammar is a cut-n-paste from ANTLRWorks where I use the built in
interpreter to run it. Is there another format that you want it in?
Also - I appreciate the detailed response on why the grammar has issues, however
I'm not sure how to fix them, please can you suggest?
Rgs, James.
> Date: Tue, 10 Jan 2012 11:01:39 -0500
> From: jbb at acm.org
> To: james_ladd at hotmail.com
> CC: antlr at mirality.co.nz; antlr-interest at antlr.org
> Subject: Re: [antlr-interest] Why does antlr not know alternative?
>
> Greetings!
>
> On 01/10/2012 12:20 AM, James Ladd wrote:
> > I fixed this issue with NUMBER by making it a parser rule. See grammar below.
>
> are comments permitted to be embedded inside your numbers?
> by making this a parser rule something like 123"comment"."another"456
> will be parsed as a number.
>
> > number returns [Number number]
> > : (d1=DIGITS r='r')? (m1='-')? d2=DIGITS ('.' d3=DIGITS)? (e='e' (m2='-')? d4=DIGITS)? {number = new Number($d1.text, $r.text, $m1.text, $d2.text, $d2.line,$d3.text, $e.text, $m2.text, $d4.text);}
> > ;
> >
> > Some numbers I can't parse are "4r1" "2r-3e4" "9e4", and I don't understand why.
>
> i think the r1 in the first example is being lexed as an IDENTIFIER and
> likewise for the e4's in the other two examples.
>
> you might try to dump out the token stream between your lexing and
> parsing phases and see if the stream contains what you expect.
>
> >
> > There is also an issue parsing '#-' and again i'm not sure why since '#' occurs only in the symbol constant rule.
> '#' is also in the array_constant rule, but i do not think that is
> relevant to this particular problem.
>
> you have a '-' in your number parsing rule and '-' in your
> BINARY_SELECTOR lexing rule and of course these are not the same tokens.
>
> again dumping the token stream will probably point out the issue...
>
>
> >
> > Any suggestions?
>
> all of the above is just speculation since you did not supply a grammar
> that i could actually run in order to reproduce your problem. hope this
> helps anyway...
>
> >
> > Rgs, James.
> >
> >
> > grammar Temp;
> >
> > options {
> > language = Java;
> > }
> > @header {
> > package st.redline.compiler;
> > }
> > @lexer::header {
> > package st.redline.compiler;
> > }
> > @lexer::members {
> > List<RecognitionException> exceptions = new ArrayList<RecognitionException>();
> > public List<RecognitionException> getExceptions() { return exceptions; }
> > public void reportError(RecognitionException e) { super.reportError(e); exceptions.add(e); }
> > }
> >
> > program
> > : primary* EOF
> > ;
> >
> > primary returns [Primary primary]
> > : WHITESPACE?
> > ( IDENTIFIER {primary = new Identifier($IDENTIFIER.text, $IDENTIFIER.line);}
> > | number {primary = $number.number;}
> > | symbol_constant {primary = $symbol_constant.symbolConstant;}
> > | CHARACTER_CONSTANT {primary = new CharacterConstant($CHARACTER_CONSTANT.text.substring(1), $CHARACTER_CONSTANT.line);}
> > | STRING {primary = new StringConstant($STRING.text, $STRING.line);}
> > | array_constant {primary = $array_constant.arrayConstant; }
> > | block {primary = $block.block;}
> > | '(' expression WHITESPACE? ')'
> > )
> > ;
> >
> > statements returns [Statements statements]
> > : non_empty_statements? { statements = $non_empty_statements.statements; }
> > ;
> >
> > non_empty_statements returns [Statements statements]
> > : WHITESPACE? a='^' expression '.' {statements = new AnswerStatement($a.line, $expression.expression);}
> > ;
> >
> > expression returns [Expression expression]
> > : WHITESPACE? IDENTIFIER WHITESPACE? ':=' e=expression {expression = new AssignmentExpression($IDENTIFIER.text, $IDENTIFIER.line, $e.expression);}
> > | simple_expression {expression = $simple_expression.simpleExpression;}
> > ;
> >
> > simple_expression returns [SimpleExpression simpleExpression]
> > @init { simpleExpression = new SimpleExpression(); }
> > : primary {simpleExpression.add($primary.primary);}
> > ;
> >
> > block returns [Block block]
> > : o= '[' WHITESPACE? block_arguments? WHITESPACE? temporaries? ']' {block = new Block($o.line, $block_arguments.blockArguments, $temporaries.temporaries);}
> > ;
> >
> > temporaries returns [List<Identifier> temporaries]
> > @init { temporaries = new ArrayList<Identifier>(); }
> > : ('|' | '||' | '|' WHITESPACE? '|') WHITESPACE? (IDENTIFIER WHITESPACE? {temporaries.add(new Identifier($IDENTIFIER.text, $IDENTIFIER.line));})+ '|' WHITESPACE?
> > ;
> >
> > block_arguments returns [List<BlockArgument> blockArguments]
> > @init { blockArguments = new ArrayList<BlockArgument>(); }
> > : (BLOCK_ARGUMENT WHITESPACE? {blockArguments.add(new BlockArgument($BLOCK_ARGUMENT.text.substring(1), $BLOCK_ARGUMENT.line));})+ '|'? WHITESPACE?
> > ;
> >
> > array_constant returns [ArrayConstant arrayConstant]
> > : h='#' array {arrayConstant = new ArrayConstant($array.array, $h.line);}
> > ;
> >
> > array returns [Array array]
> > @init { array = new Array(); }
> > : '(' (array_element {array.add($array_element.arrayElement);})* ')'
> > ;
> >
> > array_element returns [ArrayElement arrayElement]
> > : WHITESPACE
> > | number {arrayElement = $number.number;}
> > | symbol {arrayElement = $symbol.symbol;}
> > | STRING {arrayElement = new StringConstant($STRING.text, $STRING.line);}
> > | CHARACTER_CONSTANT {arrayElement = new CharacterConstant($CHARACTER_CONSTANT.text.substring(1), $CHARACTER_CONSTANT.line);}
> > | array {arrayElement = $array.array;}
> > ;
> >
> > symbol_constant returns [SymbolConstant symbolConstant]
> > : '#' symbol {symbolConstant = new SymbolConstant($symbol.symbol.value(), $symbol.symbol.line());}
> > ;
> >
> > symbol returns [Symbol symbol]
> > @init { symbol = new Symbol(); }
> > : BINARY_SELECTOR {symbol.valueAndLine($BINARY_SELECTOR.text, $BINARY_SELECTOR.line);}
> > | IDENTIFIER {symbol.valueAndLine($IDENTIFIER.text, $IDENTIFIER.line); }
> > | (KEYWORD {symbol.addValueAndLine($KEYWORD.text, $KEYWORD.line);} )+ // Decision can match input such as "KEYWORD" using multiple alternatives: 1, 2
> > ;
> >
> > number returns [Number number]
> > : (d1=DIGITS r='r')? (m1='-')? d2=DIGITS ('.' d3=DIGITS)? (e='e' (m2='-')? d4=DIGITS)? {number = new Number($d1.text, $r.text, $m1.text, $d2.text, $d2.line,$d3.text, $e.text, $m2.text, $d4.text);}
> > ;
> >
> > WHITESPACE: (' '|'\t'|'\r'|'\n')+;
> > COMMENT: '"' .* '"' {$channel = HIDDEN;};
> > BINARY_SELECTOR: ('-' (SPECIAL_CHAR)?) | (SPECIAL_CHAR)+;
> > KEYWORD: IDENTIFIER ':';
> > BLOCK_ARGUMENT: ':' IDENTIFIER;
> > IDENTIFIER: LETTER (LETTER | DIGIT)*;
> > CHARACTER_CONSTANT: '$' ('\'' | '"' | SPECIAL_CHAR | NORMAL_CHAR | DIGIT | LETTER);
> > STRING: '\'' (~'\''|'\'\'')* '\'';
> > DIGITS: DIGIT+;
> >
> > fragment LETTER: ('a'..'z' | 'A'..'Z');
> > fragment DIGIT: '0'..'9';
> > fragment SPECIAL_CHAR: '+'|'/'|'\\'|'*'|'~'|'<'|'>'|'='|'@'|'%'|'|'|'&'|'?'|'!'|',';
> > fragment NORMAL_CHAR: '['|']'|'{'|'}'|'('|')'|'^'|'_'|';'|'$'|'#'|':'|'.'|'\'';
> >
> > *end*
> >
> >
> > List: http://www.antlr.org/mailman/listinfo/antlr-interest
> > Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address
>
More information about the antlr-interest
mailing list