src/rdsl/parser.y
class ManaMana::RDSL::Parser
token GROUP
token REQUIREMENT
token TEXT
token ROW
token CELL
rule
Root:
/* empty array */ { result = RootNode.new }
| Groups { result = RootNode.new({}, val[0]) }
;
Groups:
GROUP { result = [ GroupNode.new(val[0]) ] }
| GROUP Text { result = [ GroupNode.new(val[0]) ] }
| GROUP Groups { result = [ GroupNode.new(val[0]) ] + val[1] }
| GROUP Requirements { result = [ GroupNode.new(val[0], val[1]) ] }
| GROUP Text Requirements { result = [ GroupNode.new(val[0], val[2]) ] }
| GROUP Requirements Groups { result = [ GroupNode.new(val[0], val[1]) ] + val[2] }
;
Requirements:
REQUIREMENT { result = [ RequirementNode.new(val[0]) ] }
| REQUIREMENT Requirements { result = [ RequirementNode.new(val[0]) ] + val[1] }
| REQUIREMENT RequirementBody { result = [ RequirementNode.new(val[0], val[1]) ] }
| REQUIREMENT RequirementBody Requirements { result = [ RequirementNode.new(val[0], val[1]) ] + val[2] }
;
RequirementBody:
Text { result = val[0] }
| Table { result = val[0] }
| Text Table { result = val[0] + val[1] }
| Text Table Text { result = val[0] + val[1] + val[2] }
;
Text:
TEXT { result = [] }
| TEXT Text { result = [] }
;
Table:
Rows { result = [ ExamplesNode.new({}, val[0]) ] }
;
Rows:
ROW Cells { result = [ RowNode.new({ value: val[1], offset: val[0][:offset] }) ] }
| ROW Cells Rows { result = [ RowNode.new({ value: val[1], offset: val[0][:offset] }) ] + val[2] }
;
Cells:
CELL { result = [ val[0][:value] ] }
| CELL Cells { result = [ val[0][:value] ] + val[1] }
;
end
---- header
require 'manamana/rdsl/lexer'
require 'manamana/rdsl/nodes'
---- inner
def parse(code, show_tokens=false)
@tokens = Lexer.new.tokenize(code)
puts @tokens.inspect if show_tokens
do_parse
end
def next_token
@tokens.shift
end