Fixing that still doesn't make the error go away.
reduce/reduce conflict in state [stack: TModule TUnqualifiedIdentifier
TDefine TUnqualifiedIdentifier TAssignmentOperator TIf TLparen
PExpression TRparen PExp5 *] on TElse in {
[ PExpression = PExp5 * ] followed by TElse (reduce),
[ PExpressionWithElse = PExp5 * ] followed by TElse (reduce)
}
Problem is, I don't see where there are more trailing "expression"
productions within the expression_with_else production.
On 03/11/2011 03:54 PM, Etienne M. Gagnon wrote:
Hi Eli,
See below.
...
I forgot to tell you... in "other", any trailing "stmt" (or
"expression" that terminates any of the "expression_with_else"
alternatives in your case) should be replaced by
"stmt-no-if-without-else" (or "expression_with_else" in your case).
This must apply recursively (in productions like try_expression and
except_case_clause).
Have fun!
Etienne
Package decasyntax;
Helpers
unicode_input_character = [0..0xffff];
letter = ['A'..'Z'] | ['a'..'z'] | [0x7F .. 0xFF];
digit = ['0'..'9'];
nondigit = '_' | '?' | '!' | letter;
all = [0 .. 0xFFFF];
cr = 13;
lf = 10;
tab = 9;
eol = cr | lf | cr lf;
input_character = [unicode_input_character - [cr + lf]];
not_cr_lf = [all - [cr + lf]];
not_star = [all - '*'];
not_star_slash = [not_star - '/'];
non_zero_digit = ['1'..'9'];
hex_digit = ['0'..'9'] | ['a'..'f'] | ['A'..'F'];
octal_digit = ['0'..'7'];
zero_to_three = ['0'..'3'];
decimal_numeral = '0' | non_zero_digit digit*;
hex_numeral = '0x' hex_digit+;
octal_numeral = '0' octal_digit+;
single_character = [input_character - ['"' + '\']];
octal_escape = '\' (octal_digit octal_digit? | zero_to_three octal_digit
octal_digit);
escape_sequence = '\b' | '\t' | '\n' | '\f' | '\r' | '\"' | '\' ''' | '\\' |
octal_escape;
string_character = single_character | escape_sequence;
at_operator = '@';
exponentiation_operator = '^';
Tokens
var = 'var';
protected = 'protected';
boolean_constant = 'true' | 'false';
asterisk = '*';
division_operator = '/';
addition_operator = '+';
subtraction_operator = '-';
and_operator = 'and';
or_operator = 'or';
xor_operator = 'xor';
minus_operator = '-';
exponentiation_operator = '^';
at_operator = '@';
not_operator = 'not';
method = 'method';
override = 'override';
comma = ',';
assignment_operator = ':=';
lparen = '(';
rparen = ')';
lbracket = '{';
rbracket = '}';
lsbracket = '[';
rsbracket = ']';
dot = '.';
semicolon = ';';
colon = ':';
end = 'end';
module = 'module';
labracket = '<';
rabracket = '>';
import = 'import';
define = 'define';
new = 'new';
delete = 'delete';
extends = 'extends';
class_keyword = 'class';
variant_keyword = 'variant';
exception = 'exception';
equals = '=';
different = '<>';
greatereq = '>=';
lessereq = '<=';
function = 'function';
while = 'while';
for = 'for';
case = 'case';
if = 'if';
let = 'let';
except = 'except';
finally = 'finally';
try = 'try';
throw = 'throw';
else = 'else';
type = 'type';
underscore = '_';
type_arrow = '->';
evaluation_arrow = '=>';
region = 'region';
region_combining_operator = '++';
sizeof = 'sizeof';
match = 'match';
return = 'return';
cast = 'cast';
blank = eol | tab | ' ';
tabspace = [tab + ' '];
space = [cr + [lf + [tab + ' ']]];
comment = '/*' not_star* '*'+ (not_star_slash not_star* '*'+)* '/';
unqualified_identifier = nondigit (digit | nondigit)* | 'exception';
integer_constant = decimal_numeral | hex_numeral | octal_numeral;
string_constant = '"' string_character* '"';
Ignored Tokens
blank,
comment;
Productions
module_definition =
module [name]:unqualified_identifier [imports]:import_declaration*
[definitions]:definition* end;
qualified_identifier =
{simple} unqualified_identifier |
{imported} qualified_identifier dot unqualified_identifier;
identifier_list = {one} unqualified_identifier | {many} identifier_list comma
unqualified_identifier;
import_declaration =
import [name]:qualified_identifier;
variant_case_contents = lparen tuple_component_list rparen;
variant_component =
unqualified_identifier variant_case_contents?;
type_form =
{function} function_type_form |
{scoped_pointer} at_operator lower_type_form |
{pointer} lower_type_form asterisk |
{variant} variant_keyword lbracket variant_component+ rbracket |
{class} class_keyword function_arguments? extension_clause? lbracket
[member]:member_declaration+ destructor_definition? rbracket |
{exception} exception lparen identifier_list rparen
[extension]:extension_clause? |
{others} lower_type_form;
destructor_definition = delete [destructor]:block_expression;
function_arguments_type_form = type_form comma type_form_list;
function_type_form =
{one} [argument]:lower_type_form type_arrow [result]:lower_type_form |
{many} lparen function_arguments_type_form? rparen type_arrow
[result]:lower_type_form;
recursive_type_naming =
let [name]:unqualified_identifier equals;
tuple_component =
{type} type_form |
{binding} [name]:unqualified_identifier type_annotation;
tuple_component_list =
{one} tuple_component |
{many} tuple_component_list comma tuple_component;
tuple_form =
lsbracket tuple_component_list rsbracket;
type_parameterization = labracket [arguments]:type_form_list rabracket;
lower_type_form =
{named} [typename]:qualified_identifier type_parameterization? |
{parenthetical} recursive_type_naming? lparen type_form rparen |
{tuple} tuple_form |
{array} lower_type_form lsbracket integer_constant? rsbracket |
{region} region |
{wildcard} underscore;
definition =
{globaldef} define var? unqualified_identifier type_annotation?
assignment_operator expression |
{typedef} type unqualified_identifier [parameters]:type_form_arguments?
equals type_form |
{moduledef} module_definition |
{fundef} function_definition;
type_form_arguments =
labracket [arguments]:identifier_list rabracket;
type_form_list =
{one} type_form |
{many} type_form_list comma type_form;
type_annotation =
colon [type]:type_form;
member_declaration =
{named} protected? let_assignment_list semicolon;
extension_clause =
extends lower_type_form;
argument =
[name]:unqualified_identifier [type]:type_annotation?;
argument_list =
{one} argument |
{many} argument_list comma argument;
function_arguments = lparen [arguments]:argument_list? rparen;
function_definition =
{method} method [name]:unqualified_identifier type_form_arguments?
function_arguments [type]:type_annotation [body]:block_expression? |
{override} override [name]:qualified_identifier function_arguments
[body]:block_expression |
{function} function [name]:unqualified_identifier function_arguments
[type]:type_annotation? [body]:block_expression;
expression =
{assignmentexp} qualified_identifier assignment_operator expression |
{letexp} let lparen let_assignment_list rparen expression |
{castexp} cast labracket type_form rabracket lparen expression rparen |
{matchexp} match_expression |
{tryexp} try_expression |
{finalexp} finally [finalizer]:expression |
{forexp} for lparen [initializer]:let_assignment [first_separator]:comma
[test]:expression [second_separator]:comma [step]:expression rparen
[loop]:expression |
{whilexp} while lparen [condition]:expression rparen [body]:expression |
{throwexp} throw expression |
{ifwithoutelseexp} if lparen [condition]:expression rparen
[thenbody]:expression |
{ifwithelseexp} if lparen [condition]:expression rparen
[thenbody]:expression_with_else else_clause |
{blockexp} block_expression |
{regionexp} region lsbracket integer_constant rsbracket |
{returnexp} return expression |
{others} exp5;
expression_with_else =
{assignmentexp} qualified_identifier assignment_operator
expression_with_else |
{letexp} let lparen let_assignment_list rparen expression_with_else |
{castexp} cast labracket type_form rabracket lparen expression rparen |
{matchexp} match_with_else |
{tryexp} try_expression |
{finalexp} finally [finalizer]:expression_with_else |
{forexp} for lparen [initializer]:let_assignment [first_separator]:comma
[test]:expression [second_separator]:comma [step]:expression rparen
[loop]:expression_with_else |
{whilexp} while lparen [condition]:expression rparen
[body]:expression_with_else |
{throwexp} throw expression_with_else |
{ifwithelseexp} if lparen [condition]:expression rparen
[thenbody]:expression_with_else else [elsebody]:expression_with_else |
{blockexp} block_expression |
{regionexp} region lsbracket integer_constant rsbracket |
{returnexp} return expression_with_else |
{others} exp5;
//Increasing precedence levels.
exp1 =
{at} at_operator [variable]:qualified_identifier |
{sizeof} sizeof lparen type_form rparen |
{primitive_integer} integer_constant |
{primitive_boolean} boolean_constant |
{primitive_string} string_constant |
{tuple} lsbracket expression_list rsbracket |
{lambda} function function_arguments block_expression |
{call} function_call_expression |
{parenthetical} parenthetical_expression |
{identifier} qualified_identifier;
exp2 =
{exponentiation} [exp1]:exp1 exponentiation_operator [exp2]:exp2 |
{minus} minus_operator exp2 |
{not} not_operator exp2 |
{others} exp1;
exp3 =
{and} [exp1]:exp3 and_operator [exp2]:exp2 |
{or} [exp1]:exp3 or_operator [exp2]:exp2 |
{xor} [exp1]:exp3 xor_operator [exp2]:exp2 |
{multiply} [exp1]:exp3 asterisk [exp2]:exp2 |
{division} [exp1]:exp3 division_operator [exp2]:exp2 |
{others} exp2;
exp4 =
{plus} [exp1]:exp4 addition_operator [exp2]:exp3 |
{minus} [exp1]:exp4 subtraction_operator [exp2]:exp3 |
{regions} [exp1]:exp4 region_combining_operator [exp2]:exp3 |
{others} exp3;
exp5 =
{greater} [exp1]:exp4 rabracket [exp2]:exp4 |
{greatereq} [exp1]:exp4 greatereq [exp2]:exp4 |
{less} [exp1]:exp4 labracket [exp2]:exp4 |
{lessereq} [exp1]:exp4 lessereq [exp2]:exp4 |
{equals} [exp1]:exp4 equals [exp2]:exp4 |
{different} [exp1]:exp4 different [exp2]:exp4 |
{others} exp4;
function_call_expression =
{variable} [function]:qualified_identifier lparen
[arguments]:expression_list? rparen |
{parens} [function]:parenthetical_expression lparen
[arguments]:expression_list? rparen |
{region_alloc} new [region]:parenthetical_expression
[argument]:parenthetical_expression |
{region_free} delete [argument]:parenthetical_expression |
{deleteregion} delete region [which]:parenthetical_expression;
except_case_clause =
case [name]:unqualified_identifier type_annotation evaluation_arrow
[body]:expression;
except_case_clause_with_else =
case [name]:unqualified_identifier type_annotation evaluation_arrow
[body]:expression_with_else;
try_expression =
{one} try expression except except_case_clause |
{many} try expression except lbracket except_case_clause+ rbracket;
try_expression_with_else =
{one} try expression except except_case_clause_with_else |
{many} try expression except lbracket except_case_clause+ rbracket;
parenthetical_expression =
lparen expression rparen;
expression_list =
{one} expression |
{many} expression_list comma expression;
else_clause =
else [else_body]:expression;
let_assignment =
unqualified_identifier type_annotation? assignment_operator expression;
let_assignment_list =
{one} let_assignment |
{many} let_assignment_list comma let_assignment;
match_case_clause =
{variable} case [name]:unqualified_identifier type_annotation
evaluation_arrow [body]:expression |
{variant} case qualified_identifier variant_case_contents? evaluation_arrow
[body]:expression |
{tuple} case tuple_form evaluation_arrow [body]:expression;
//{one} match lparen expression rparen match_case_clause else_clause? |
//{many}
match_expression =
match lparen expression rparen lbracket match_case_clause+ rbracket
else_clause?;
//{one} match lparen expression rparen match_case_clause else
expression_with_else |
//{many}
match_with_else =
match lparen expression rparen lbracket match_case_clause+ rbracket else
expression_with_else;
block_contents =
{one} expression |
{many} block_contents [separator]:semicolon expression
[terminator]:semicolon;
block_expression =
lbracket block_contents rbracket;
_______________________________________________
SableCC-Discussion mailing list
[email protected]
http://lists.sablecc.org/listinfo/sablecc-discussion