22require "lrama/grammar/code"
33require "lrama/grammar/counter"
44require "lrama/grammar/error_token"
5+ require "lrama/grammar/parser_state"
56require "lrama/grammar/percent_code"
67require "lrama/grammar/precedence"
78require "lrama/grammar/printer"
1617module Lrama
1718 # Grammar is the result of parsing an input grammar file
1819 class Grammar
19- attr_reader :percent_codes , :eof_symbol , :error_symbol , :undef_symbol , :accept_symbol , :aux
20+ attr_reader :percent_codes , :parser_states , : eof_symbol, :error_symbol , :undef_symbol , :accept_symbol , :aux
2021 attr_accessor :union , :expect ,
2122 :printers , :error_tokens ,
2223 :lex_param , :parse_param , :initial_action ,
@@ -31,6 +32,7 @@ def initialize(rule_counter)
3132 @percent_codes = [ ]
3233 @printers = [ ]
3334 @error_tokens = [ ]
35+ @parser_states = [ ]
3436 @symbols = [ ]
3537 @types = [ ]
3638 @rule_builders = [ ]
@@ -58,6 +60,10 @@ def add_error_token(ident_or_tags:, token_code:, lineno:)
5860 @error_tokens << ErrorToken . new ( ident_or_tags : ident_or_tags , token_code : token_code , lineno : lineno )
5961 end
6062
63+ def add_parser_state ( state_id , state_list )
64+ @parser_states << ParserState . new ( state_id : state_id , state_list : state_list )
65+ end
66+
6167 def add_term ( id :, alias_name : nil , tag : nil , token_id : nil , replace : false )
6268 if token_id && ( sym = @symbols . find { |s | s . token_id == token_id } )
6369 if replace
@@ -186,7 +192,7 @@ def find_symbol_by_id(id)
186192 end
187193
188194 def find_symbol_by_id! ( id )
189- find_symbol_by_id ( id ) || ( raise "Symbol not found: #{ id } " )
195+ find_symbol_by_id ( id ) || ( raise "Symbol not found: #{ id . s_value } " )
190196 end
191197
192198 def find_symbol_by_number! ( number )
0 commit comments