shift/reduce conflict in state [stack: TModule TUnqualifiedIdentifier TDefine PTypedVariableDeclaration TAssignmentOperator TThrow *] on TUnqualifiedIdentifier in {
    [ PExpression = * ] followed by TUnqualifiedIdentifier (reduce),
    [ PQualifiedIdentifier = * TUnqualifiedIdentifier ] (shift)
}

The problem is that I don't see a place where the expression production can consist of *nothing*, and thereby allow the reduction stated here. Can anyone perhaps give me a pointer?

Thank you very much,
Eli
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
  global_variable_modifier = 'constant';
  publicity_modifier = 'public' | 'protected';
  boolean_constant = 'true' | 'false';
  module_modifier = 'unsafe' | 'pure';
  multiplication_operator = '*';
  division_operator = '/';
  addition_operator = '+';
  subtraction_operator = '-';
  and_operator = 'and';
  or_operator = 'or';
  xor_operator = 'xor';
  minus_operator = '-';
  exponentiation_operator = '^';
  at_operator = '@';
  not_operator = 'not';
  generic = 'generic';
  method = 'method';
  comma = ',';
  assignment_operator = ':=';
  lparen = '(';
  rparen = ')';
  lbracket = '{';
  rbracket = '}';
  lsbracket = '[';
  rsbracket = ']';
  dot = '.';
  semicolon = ';';
  end_module = 'end.';
  module = 'module';
  labracket = '<';
  rabracket = '>';
  import = 'import';
  define = 'define';
  constructor = 'constructor';
  destructor = 'destructor';
  extends = 'extends';
  class_keyword = 'class';
  subrange = 'subrange';
  enum = 'enum';
  exception = 'exception';
  equals = '=';
  different = '<>';
  greatereq = '>=';
  lessereq = '<=';
  function = 'function';
  lambda = 'lambda';
  return = 'return';
  while = 'while';
  do = 'do';
  until = 'until';
  for = 'for';
  case = 'case';
  cond = 'cond';
  let = 'let';
  except = 'except';
  finally = 'finally';
  try = 'try';
  throw = 'throw';
  else = 'else';
  cast = 'cast';
  alias_operator = '&';
  type = 'type';
  closure = 'closure';
  null_literal = 'null';
  
  blank = eol | tab | ' ';
  tabspace = [tab + ' '];
  space = [cr + [lf + [tab + ' ']]];
  comment = '/*' not_star* '*'+ (not_star_slash not_star* '*'+)* '/';
  unqualified_identifier = nondigit (digit | nondigit)*;
  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_module;

  qualified_identifier = 
    {simple} unqualified_identifier |
    {imported} qualified_identifier dot unqualified_identifier;

  /* Syntax forms for module-level definitions, including types. */
  identifier_list = {one} unqualified_identifier | {many} identifier_list comma 
unqualified_identifier;
    
  type_arguments = 
    labracket [arguments]:identifier_list rabracket;
    
  import_declaration = 
    import [name]:qualified_identifier semicolon;
    
  type_definition = 
    type [name]:unqualified_identifier equals type_form;
    
  type_form =
    {class} class_form |
    {subrange} subrange_form |
    {enum} enum_form |
    {exception} exception_form |
    {functype} functype_form |
    {closure} closure_form |
    {alias} alias_form |
    {rename} qualified_identifier;
    
  class_form = 
    class_keyword [parameters]:type_arguments? [extension]:extension_clause? 
lbracket [member]:member_declaration+ rbracket;
  
  subrange_form = 
    subrange lparen [floor]:expression comma [ceiling]:expression rparen 
[parent]:extension_clause semicolon;
  
  enum_form = 
    enum lparen identifier_list rparen [extension]:extension_clause? semicolon;
  
  exception_form = 
    exception lparen identifier_list rparen [extension]:extension_clause? 
semicolon;
    
  functype_form = 
    function [type]:qualified_identifier? lparen [arguments]:argument_list 
rparen semicolon;
    
  closure_form = 
    closure [functype]:extension_clause lbracket 
[variables]:member_declaration* rbracket;
    
  alias_form =
    [type]:qualified_identifier alias_operator nullable_alias_clause? semicolon;

  nullable_alias_clause =
    or_operator null_literal;
      
  definition = 
    {globaldef} global_variable_definition |
    {typedef} type_definition |
    {moduledef} module_definition |
    {fundef} function_definition;
    
  variable_type_form =
    [isinstance]:alias_operator? [typename]:qualified_identifier 
[arguments]:type_arguments?;

  typed_variable_declaration =
    [name]:unqualified_identifier [isinstance]:alias_operator 
[type]:variable_type_form;
    
  typed_variable_definition =
    [declaration]:typed_variable_declaration assignment_operator 
[initial_value]:expression;
    
  global_variable_definition = 
    define [modifier]:global_variable_modifier? 
[definition]:typed_variable_definition semicolon;
    
  member_declaration = 
    {named} publicity_modifier? [names]:identifier_list 
[type]:variable_type_form semicolon |
    {indexed} publicity_modifier? [type]:variable_type_form lsbracket 
[quantity]:integer_constant rsbracket semicolon |
    {constructor} constructor [name]:unqualified_identifier lparen 
[arguments]:argument_list rparen [body]:expression_block |
    {destructor} destructor [name]:unqualified_identifier lparen 
[arguments]:argument_list rparen [body]:expression_block;
    
  extension_clause = 
    extends [supertype]:qualified_identifier [arguments]:type_arguments?;
    
  argument_declaration =
    [name]:unqualified_identifier [type]:qualified_identifier?;
  
  generic_argument_declaration =
    {dynamic} generic [name]:unqualified_identifier [type]:qualified_identifier 
|
    {static} argument_declaration;
    
  argument_list = 
    {one} argument_declaration |
    {many} argument_list comma argument_declaration;
    
  generic_argument_list =
    {one} generic_argument_declaration |
    {many} generic_argument_list comma generic_argument_declaration;
    
  function_definition = 
    {generic} generic [type]:qualified_identifier [name]:unqualified_identifier 
lparen [arguments]:generic_argument_list rparen [body]:block_expression? |
    {method} method [name]:qualified_identifier lparen 
[arguments]:argument_list rparen [body]:block_expression |
    {function} function [name]:unqualified_identifier lparen 
[arguments]:argument_list rparen [body]:block_expression;
    
  expression =
    {assignmentexp} assignment_expression |
    {letexp} let_expression |
    {tryexp} try_expression |
    {forexp} for_expression |
    {whileexp} while_expression |
    {doexp} do_expression |
    {throwexp} throw_expression |
    {condexp} cond_expression |
    {blockexp} block_expression |
    {castexp} cast_expression |
    {others} exp1;
    
  //Increasing precedence levels.
  exp1 =   
    {at} at_operator [location]:left_expression |
    {call} function_call_expression |
    {primitive} primitive_expression |
    {tupleexp} tuple_expression |
    {lambdaexp} lambda_expression |
    {parenthetical} parenthetical_expression |
    {left} left_expression |
    {others} exp2;
  
  exp2 = 
    {exponentiation} [exp1]:exp1 exponentiation_operator [exp2]:exp2 |
    {minus} minus_operator exp2 |
    {not} not_operator exp2 |
    {others} exp3;
  
  exp3 = 
    {and}  [exp1]:exp3 and_operator [exp2]:exp2 |
    {or}  [exp1]:exp3 or_operator [exp2]:exp2 |
    {xor}  [exp1]:exp3 xor_operator [exp2]:exp2 |
    {others} exp4;
    
  exp4 =
    {multiply} [exp1]:exp4 multiplication_operator [exp2]:exp3 |
    {division} [exp1]:exp4 division_operator [exp2]:exp3 |
    {others} exp5;
    
  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;
    
  function_call_expression = |
    {identifier} [function]:qualified_identifier lparen 
[arguments]:expression_list? rparen |
    {parens} [function]:parenthetical_expression lparen 
[arguments]:expression_list? rparen;
  
  parenthetical_expression =
    lparen expression rparen;
    
  variable_subscript =
    lsbracket expression rsbracket;
    
  left_expression = 
    {variable} [var]:qualified_identifier |
    {subscript} [var]:left_expression [subscript]:variable_subscript |
    {parensub} [var]:parenthetical_expression [subscript]:variable_subscript;
    
  primitive_expression = 
    {integer} integer_constant |
    {boolean} boolean_constant |
    {string} string_constant |
    {null} null_literal;
    
  expression_list = 
    {one} expression |
    {many} expression_list comma expression;
    
  tuple_expression = 
    lsbracket expression_list rsbracket;
    
  lambda_expression = 
    lambda lparen argument_list rparen block_expression;
  
  assignment_expression =
    left_expression assignment_operator expression;
    
  let_assignment = 
    unqualified_identifier assignment_operator expression;
    
  let_assignment_list = 
    {one} let_assignment |
    {many} let_assignment_list semicolon let_assignment;
    
  let_expression =
    let lparen [let_assignments]:let_assignment_list rparen expression;
  
  except_expression_clause =
    except lparen typed_variable_declaration rparen expression;
    
  finally_expression_clause =
    finally expression;
    
  try_expression =
    try expression [exceptions]:except_expression_clause* 
[finally]:finally_expression_clause;
    
  for_expression =
    for lparen [initializer]:let_assignment [first_separator]:semicolon 
[test]:expression [second_separator]:semicolon [step]:expression rparen 
[loop]:expression;
    
  while_expression =
    while lparen [condition]:expression rparen [body]:expression;
    
  do_expression =
    do [body]:expression until [condition]:expression;
    
  throw_expression =
    throw expression;
  
  case_expression_clause =
    case lparen [condition]:expression rparen [body]:expression;
    
  cond_expression =
    {one} cond [case]:case_expression_clause |
    {many} cond lbracket [cases]:case_expression_clause+ rbracket;
    
  cast_expression_clause =
    case lparen typed_variable_definition rparen [success]:expression;
    
  cast_expression =
    {one} cast [case]:cast_expression_clause else [failure]:expression |
    {many} cast lbracket [cases]:cast_expression_clause+ rbracket else 
[failure]:expression;
    
  expression_block =
    {one} expression |
    {many} expression_block semicolon expression;
        
  block_expression =
    lbracket expression_block rbracket;
_______________________________________________
SableCC-Discussion mailing list
[email protected]
http://lists.sablecc.org/listinfo/sablecc-discussion

Reply via email to