Skip to content

Commit

Permalink
Merge pull request #53 from alitaso345/move_code_under_grammar
Browse files Browse the repository at this point in the history
Move multiple classes under grammar
  • Loading branch information
yui-knk committed Jul 9, 2023
2 parents 5cf6cd9 + 0a5b33c commit 07dc3ee
Show file tree
Hide file tree
Showing 18 changed files with 321 additions and 307 deletions.
7 changes: 0 additions & 7 deletions lib/lrama.rb
Original file line number Diff line number Diff line change
@@ -1,21 +1,14 @@
require "lrama/bitmap"
require "lrama/code"
require "lrama/command"
require "lrama/context"
require "lrama/digraph"
require "lrama/error_token"
require "lrama/grammar"
require "lrama/lexer"
require "lrama/output"
require "lrama/parser"
require "lrama/precedence"
require "lrama/printer"
require "lrama/reference"
require "lrama/report"
require "lrama/rule"
require "lrama/state"
require "lrama/states"
require "lrama/states_reporter"
require "lrama/symbol"
require "lrama/version"
require "lrama/warning"
121 changes: 0 additions & 121 deletions lib/lrama/code.rb

This file was deleted.

7 changes: 0 additions & 7 deletions lib/lrama/error_token.rb

This file was deleted.

7 changes: 7 additions & 0 deletions lib/lrama/grammar.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
require "lrama/grammar/code"
require "lrama/grammar/error_token"
require "lrama/grammar/precedence"
require "lrama/grammar/printer"
require "lrama/grammar/reference"
require "lrama/grammar/rule"
require "lrama/grammar/symbol"
require "lrama/grammar/union"
require "lrama/lexer"

Expand Down
123 changes: 123 additions & 0 deletions lib/lrama/grammar/code.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
require "forwardable"

module Lrama
class Grammar
class Code < Struct.new(:type, :token_code, keyword_init: true)
extend Forwardable

def_delegators "token_code", :s_value, :line, :column, :references

# $$, $n, @$, @n is translated to C code
def translated_code
case type
when :user_code
translated_user_code
when :initial_action
translated_initial_action_code
end
end

# * ($1) error
# * ($$) *yyvaluep
# * (@1) error
# * (@$) *yylocationp
def translated_printer_code(tag)
t_code = s_value.dup

references.reverse.each do |ref|
first_column = ref.first_column
last_column = ref.last_column

case
when ref.value == "$" && ref.type == :dollar # $$
# Omit "<>"
member = tag.s_value[1..-2]
str = "((*yyvaluep).#{member})"
when ref.value == "$" && ref.type == :at # @$
str = "(*yylocationp)"
when ref.type == :dollar # $n
raise "$#{ref.value} can not be used in %printer."
when ref.type == :at # @n
raise "@#{ref.value} can not be used in %printer."
else
raise "Unexpected. #{self}, #{ref}"
end

t_code[first_column..last_column] = str
end

return t_code
end
alias :translated_error_token_code :translated_printer_code


private

# * ($1) yyvsp[i]
# * ($$) yyval
# * (@1) yylsp[i]
# * (@$) yyloc
def translated_user_code
t_code = s_value.dup

references.reverse.each do |ref|
first_column = ref.first_column
last_column = ref.last_column

case
when ref.value == "$" && ref.type == :dollar # $$
# Omit "<>"
member = ref.tag.s_value[1..-2]
str = "(yyval.#{member})"
when ref.value == "$" && ref.type == :at # @$
str = "(yyloc)"
when ref.type == :dollar # $n
i = -ref.position_in_rhs + ref.value
# Omit "<>"
member = ref.tag.s_value[1..-2]
str = "(yyvsp[#{i}].#{member})"
when ref.type == :at # @n
i = -ref.position_in_rhs + ref.value
str = "(yylsp[#{i}])"
else
raise "Unexpected. #{self}, #{ref}"
end

t_code[first_column..last_column] = str
end

return t_code
end

# * ($1) error
# * ($$) yylval
# * (@1) error
# * (@$) yylloc
def translated_initial_action_code
t_code = s_value.dup

references.reverse.each do |ref|
first_column = ref.first_column
last_column = ref.last_column

case
when ref.value == "$" && ref.type == :dollar # $$
str = "yylval"
when ref.value == "$" && ref.type == :at # @$
str = "yylloc"
when ref.type == :dollar # $n
raise "$#{ref.value} can not be used in initial_action."
when ref.type == :at # @n
raise "@#{ref.value} can not be used in initial_action."
else
raise "Unexpected. #{self}, #{ref}"
end

t_code[first_column..last_column] = str
end

return t_code
end
end
end
end
9 changes: 9 additions & 0 deletions lib/lrama/grammar/error_token.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module Lrama
class Grammar
class ErrorToken < Struct.new(:ident_or_tags, :code, :lineno, keyword_init: true)
def translated_code(member)
code.translated_error_token_code(member)
end
end
end
end
11 changes: 11 additions & 0 deletions lib/lrama/grammar/precedence.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module Lrama
class Grammar
class Precedence < Struct.new(:type, :precedence, keyword_init: true)
include Comparable

def <=>(other)
self.precedence <=> other.precedence
end
end
end
end
9 changes: 9 additions & 0 deletions lib/lrama/grammar/printer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module Lrama
class Grammar
class Printer < Struct.new(:ident_or_tags, :code, :lineno, keyword_init: true)
def translated_code(member)
code.translated_printer_code(member)
end
end
end
end
16 changes: 16 additions & 0 deletions lib/lrama/grammar/reference.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# type: :dollar or :at
# ex_tag: "$<tag>1" (Optional)

module Lrama
class Grammar
class Reference < Struct.new(:type, :value, :ex_tag, :first_column, :last_column, :referring_symbol, :position_in_rhs, keyword_init: true)
def tag
if ex_tag
ex_tag
else
referring_symbol.tag
end
end
end
end
end
37 changes: 37 additions & 0 deletions lib/lrama/grammar/rule.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
module Lrama
class Grammar
class Rule < Struct.new(:id, :lhs, :rhs, :code, :nullable, :precedence_sym, :lineno, keyword_init: true)
# TODO: Change this to display_name
def to_s
l = lhs.id.s_value
r = rhs.empty? ? "ε" : rhs.map {|r| r.id.s_value }.join(", ")

"#{l} -> #{r}"
end

# Used by #user_actions
def as_comment
l = lhs.id.s_value
r = rhs.empty? ? "%empty" : rhs.map {|r| r.display_name }.join(" ")

"#{l}: #{r}"
end

def precedence
precedence_sym && precedence_sym.precedence
end

def initial_rule?
id == 0
end

def translated_code
if code
code.translated_code
else
nil
end
end
end
end
end
Loading

0 comments on commit 07dc3ee

Please sign in to comment.