[antlr-interest] Changing fragments to rules...
James Ladd
james_ladd at hotmail.com
Fri Jan 6 13:52:08 PST 2012
Hi All,
I have a grammar that interprets fine in antlrworks when it contains 'fragments'.
When I move these into rules because I want to do actions the parsing fails with
a no viable alternative. I'm really lost as to why - The syntax diagrams looks fine
there are no error reported during code compilation.
The output in the interpreter shows nodes program->primary->array_constant->array->'('->NoViableAlternative.
This is my input:
#(12.3 Abc + at:put: 'str' $c)
*** Grammar before WITH FRAGMENTS: ***
grammar Temp;
options {
language = Java;
}
@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* WHITESPACE?
;
primary returns [Primary primary]
: WHITESPACE?
( IDENTIFIER {primary = new Identifier($IDENTIFIER.text, $IDENTIFIER.line);}
| NUMBER {primary = new Number($NUMBER.text, $NUMBER.line);}
| SYMBOL_CONSTANT {primary = new SymbolConstant($SYMBOL_CONSTANT.text.substring(1), $SYMBOL_CONSTANT.line);}
| CHARACTER_CONSTANT {primary = new CharacterConstant($CHARACTER_CONSTANT.text.substring(1), $CHARACTER_CONSTANT.line);}
| STRING {primary = new StringConstant($STRING.text, $STRING.line);}
| ARRAY_CONSTANT
) // BLOCK | EXPRESSION
;
WHITESPACE: (' '|'\t'|'\r'|'\n')+;
COMMENT: '"' .* '"' {$channel = HIDDEN;};
BINARY_SELECTOR: ('-' (SPECIAL_CHAR)?) | (SPECIAL_CHAR)+;
KEYWORD: IDENTIFIER ':';
IDENTIFIER: LETTER (LETTER | DIGIT)*;
NUMBER: ((NUMBER_LEFT)? ('-')? DIGITS (NUMBER_RIGHT_P1)? (NUMBER_RIGHT_P2)?);
SYMBOL_CONSTANT: '#' SYMBOL;
CHARACTER_CONSTANT: '$' ('\'' | '"' | SPECIAL_CHAR | NORMAL_CHAR | DIGIT | LETTER);
STRING: '\'' (~'\''|'\'\'')* '\'';
ARRAY_CONSTANT: '#' ARRAY;
fragment ARRAY: '(' (ARRAY_ELEMENT)* ')';
fragment ARRAY_ELEMENT: WHITESPACE | NUMBER | SYMBOL | STRING | CHARACTER_CONSTANT | ARRAY;
fragment SYMBOL: IDENTIFIER | BINARY_SELECTOR | (KEYWORD)+;
fragment NUMBER_LEFT: DIGITS 'r';
fragment NUMBER_RIGHT_P1: '.' DIGITS;
fragment NUMBER_RIGHT_P2: 'e' ('-')? DIGITS;
fragment LETTER: ('a'..'z' | 'A'..'Z');
fragment DIGIT: '0'..'9';
fragment DIGITS: DIGIT+;
fragment SPECIAL_CHAR: '+'|'/'|'\\'|'*'|'~'|'<'|'>'|'='|'@'|'%'|'|'|'&'|'?'|'!'|',';
fragment NORMAL_CHAR: '['|']'|'{'|'}'|'('|')'|'^'|'_'|';'|'$'|'#'|':'|'.'|'\'';
*** Grammar after with some fragments turned into rules: ***
grammar Temp;
options {
language = Java;
}
@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* WHITESPACE?
;
primary returns [Primary primary]
: WHITESPACE?
( IDENTIFIER {primary = new Identifier($IDENTIFIER.text, $IDENTIFIER.line);}
| NUMBER {primary = new Number($NUMBER.text, $NUMBER.line);}
| SYMBOL_CONSTANT {primary = new SymbolConstant($SYMBOL_CONSTANT.text.substring(1), $SYMBOL_CONSTANT.line);}
| CHARACTER_CONSTANT {primary = new CharacterConstant($CHARACTER_CONSTANT.text.substring(1), $CHARACTER_CONSTANT.line);}
| STRING {primary = new StringConstant($STRING.text, $STRING.line);}
| array_constant
) // BLOCK | EXPRESSION
;
array_constant
: '#' array
;
array
: '(' (ARRAY_ELEMENT)* ')'
;
WHITESPACE: (' '|'\t'|'\r'|'\n')+;
COMMENT: '"' .* '"' {$channel = HIDDEN;};
BINARY_SELECTOR: ('-' (SPECIAL_CHAR)?) | (SPECIAL_CHAR)+;
KEYWORD: IDENTIFIER ':';
IDENTIFIER: LETTER (LETTER | DIGIT)*;
NUMBER: ((NUMBER_LEFT)? ('-')? DIGITS (NUMBER_RIGHT_P1)? (NUMBER_RIGHT_P2)?);
SYMBOL_CONSTANT: '#' SYMBOL;
CHARACTER_CONSTANT: '$' ('\'' | '"' | SPECIAL_CHAR | NORMAL_CHAR | DIGIT | LETTER);
STRING: '\'' (~'\''|'\'\'')* '\'';
fragment ARRAY_ELEMENT: WHITESPACE | NUMBER | SYMBOL | STRING | CHARACTER_CONSTANT;
fragment SYMBOL: IDENTIFIER | BINARY_SELECTOR | (KEYWORD)+;
fragment NUMBER_LEFT: DIGITS 'r';
fragment NUMBER_RIGHT_P1: '.' DIGITS;
fragment NUMBER_RIGHT_P2: 'e' ('-')? DIGITS;
fragment LETTER: ('a'..'z' | 'A'..'Z');
fragment DIGIT: '0'..'9';
fragment DIGITS: DIGIT+;
fragment SPECIAL_CHAR: '+'|'/'|'\\'|'*'|'~'|'<'|'>'|'='|'@'|'%'|'|'|'&'|'?'|'!'|',';
fragment NORMAL_CHAR: '['|']'|'{'|'}'|'('|')'|'^'|'_'|';'|'$'|'#'|':'|'.'|'\'';
More information about the antlr-interest
mailing list