summaryrefslogtreecommitdiff
path: root/grammar.rb
diff options
context:
space:
mode:
Diffstat (limited to 'grammar.rb')
-rw-r--r--grammar.rb96
1 files changed, 96 insertions, 0 deletions
diff --git a/grammar.rb b/grammar.rb
new file mode 100644
index 0000000..02f4270
--- /dev/null
+++ b/grammar.rb
@@ -0,0 +1,96 @@
+require 'nlp_ruby'
+
+class Terminal
+ attr_accessor :w
+
+ def initialize s
+ @w = s
+ end
+
+ def to_s
+ "T<#{@w}>"
+ end
+end
+
+class NonTerminal
+ attr_accessor :sym, :n
+
+ def initialize s, n=1
+ @sym = s
+ @n = n
+ end
+
+ def to_s
+ "NT<#{sym}>"
+ end
+end
+
+class Span
+ attr_accessor :left, :right
+
+ def initialize left=-1, right=-1
+ @left = left
+ @right = right
+ end
+end
+
+class Rule
+ attr_accessor :lhs, :rhs, :span
+
+ def initialize lhs=nil, rhs=nil, span=Span.new
+ @lhs = ''
+ @rhs = []
+ @span = span
+ end
+
+ def to_s
+ "#{lhs} -> #{rhs.map{|i|i.to_s}.join ' '} (#{arity}) (#{@span.left}, #{@span.right})"
+ end
+
+ def arity
+ rhs.reject { |i| i.class == Terminal }.size
+ end
+
+ def from_s s
+ a = splitpipe s, 3
+ @lhs = NonTerminal.new a[0].strip.gsub!(/(\[|\])/, "")
+ a[1].split.each { |i|
+ i.strip!
+ if i[0]=='[' && i[i.size-1] == ']'
+ @rhs << NonTerminal.new(i.gsub!(/(\[|\])/, "").split(',')[0])
+ else
+ @rhs << Terminal.new(i)
+ end
+ }
+ @span = Span.new
+ end
+
+ def self.from_s s
+ r = self.new
+ r.from_s s
+ return r
+ end
+end
+
+class Grammar
+ attr_accessor :rules
+
+ def initialize fn
+ @rules = []
+ l = ReadFile.readlines_strip fn
+ l.each { |i|
+ @rules << Rule.from_s(i)
+ }
+ end
+
+ def to_s
+ s = ''
+ @rules.each { |r| s += r.to_s+"\n" }
+ end
+end
+
+
+
+
+
+