unify grammar file
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
|
||||
grammar BasicTypes
|
||||
grammar Bosl
|
||||
|
||||
# unicode generalized categories , according to regex ruby page
|
||||
rule lower /[[:lower:]]/ end # Lowercase alphabetical character
|
||||
@ -135,4 +135,107 @@ grammar BasicTypes
|
||||
'!' space*
|
||||
end
|
||||
|
||||
rule more_args
|
||||
(comma basic_expression )* {
|
||||
captures(:basic_expression).collect{|u| u.value }
|
||||
}
|
||||
end
|
||||
|
||||
rule argument_list
|
||||
(left_parenthesis basic_expression? more_args right_parenthesis){
|
||||
args = [ ]
|
||||
args << capture(:basic_expression).value if capture(:basic_expression)
|
||||
args += capture(:more_args).value if capture(:more_args)
|
||||
args
|
||||
}
|
||||
end
|
||||
|
||||
rule call_site
|
||||
(basic_expression "." name_expression argument_list space?) {
|
||||
Ast::CallSiteExpression.new(capture(:name_expression).to_str ,
|
||||
capture(:argument_list).value ,
|
||||
capture(:basic_expression).value )
|
||||
}
|
||||
end
|
||||
|
||||
rule value_expression
|
||||
call_site | basic_expression
|
||||
end
|
||||
|
||||
rule function_definition
|
||||
keyword_def name:function_name parameter_list newline expressions_end newline
|
||||
end
|
||||
|
||||
rule parameter_list
|
||||
left_parenthesis parameter_list:( name:parameter? (comma name:parameter)* ) right_parenthesis
|
||||
end
|
||||
|
||||
rule more_typed_args
|
||||
(comma typed_arg )* {
|
||||
captures(:typed_arg).collect{|u| u.value }
|
||||
}
|
||||
end
|
||||
|
||||
rule typed_argument_list
|
||||
(left_parenthesis typed_arg? more_typed_args right_parenthesis){
|
||||
args = [ ]
|
||||
args << capture(:typed_arg).value if capture(:typed_arg)
|
||||
args += capture(:more_typed_args).value if capture(:more_typed_args)
|
||||
args
|
||||
}
|
||||
end
|
||||
|
||||
rule type
|
||||
(typ:("int" | "ref") space*) { capture(:typ).to_s }
|
||||
end
|
||||
|
||||
rule typed_arg
|
||||
(type name_expression) {
|
||||
Ast::TypedName.new(capture(:type).value , capture(:name_expression).value.name)
|
||||
}
|
||||
end
|
||||
|
||||
rule variable_definition
|
||||
(typed_arg ("=" space* value_expression)?) {
|
||||
type = capture(:typed_arg).value
|
||||
value = capture(:value_expression) ? capture(:value_expression).value : nil
|
||||
var = Ast::VariableDefinition.new(type.type , type.name , value)
|
||||
}
|
||||
end
|
||||
|
||||
rule assignment
|
||||
(name_expression "=" space* value_expression){
|
||||
Ast::AssignmentExpression.new( capture(:name_expression).value.name , capture(:value_expression).value)
|
||||
}
|
||||
end
|
||||
|
||||
rule conditional
|
||||
(keyword_if left_parenthesis value_expression right_parenthesis
|
||||
body
|
||||
keyword_end) {
|
||||
Ast::IfExpression.new( capture(:value_expression).value , capture(:body).value , nil)
|
||||
}
|
||||
end
|
||||
|
||||
rule while
|
||||
keyword_while left_parenthesis value_expression right_parenthesis keyword_do
|
||||
body
|
||||
keyword_end
|
||||
end
|
||||
|
||||
rule return
|
||||
keyword_return value_expression newline
|
||||
end
|
||||
|
||||
rule body
|
||||
(statement+){
|
||||
captures(:statement).collect{|u| u.value }
|
||||
}
|
||||
end
|
||||
|
||||
rule statement
|
||||
conditional | while | return | variable_definition | assignment
|
||||
end
|
||||
|
||||
|
||||
end
|
@ -1,40 +0,0 @@
|
||||
grammar Expression
|
||||
include BasicTypes
|
||||
|
||||
rule more_args
|
||||
(comma basic_expression )* {
|
||||
captures(:basic_expression).collect{|u| u.value }
|
||||
}
|
||||
end
|
||||
|
||||
rule argument_list
|
||||
(left_parenthesis basic_expression? more_args right_parenthesis){
|
||||
args = [ ]
|
||||
args << capture(:basic_expression).value if capture(:basic_expression)
|
||||
args += capture(:more_args).value if capture(:more_args)
|
||||
args
|
||||
}
|
||||
end
|
||||
|
||||
rule call_site
|
||||
(basic_expression "." name_expression argument_list space?) {
|
||||
Ast::CallSiteExpression.new(capture(:name_expression).to_str ,
|
||||
capture(:argument_list).value ,
|
||||
capture(:basic_expression).value )
|
||||
}
|
||||
end
|
||||
|
||||
rule value_expression
|
||||
call_site | basic_expression
|
||||
end
|
||||
|
||||
rule function_definition
|
||||
keyword_def name:function_name parameter_list newline expressions_end newline
|
||||
end
|
||||
|
||||
rule parameter_list
|
||||
left_parenthesis parameter_list:( name:parameter? (comma name:parameter)* ) right_parenthesis
|
||||
end
|
||||
|
||||
root call_site
|
||||
end
|
@ -1,37 +0,0 @@
|
||||
grammar Function
|
||||
include Statement
|
||||
|
||||
|
||||
rule more_typed_args
|
||||
(comma typed_arg )* {
|
||||
captures(:typed_arg).collect{|u| u.value }
|
||||
}
|
||||
end
|
||||
|
||||
rule typed_argument_list
|
||||
(left_parenthesis typed_arg? more_typed_args right_parenthesis){
|
||||
args = [ ]
|
||||
args << capture(:typed_arg).value if capture(:typed_arg)
|
||||
args += capture(:more_typed_args).value if capture(:more_typed_args)
|
||||
args
|
||||
}
|
||||
end
|
||||
|
||||
rule call_site
|
||||
(basic_expression "." name_expression argument_list space?) {
|
||||
Ast::CallSiteExpression.new(capture(:name_expression).to_str ,
|
||||
capture(:argument_list).value ,
|
||||
capture(:basic_expression).value )
|
||||
}
|
||||
end
|
||||
|
||||
rule function_definition
|
||||
keyword_def name:function_name parameter_list newline expressions_end newline
|
||||
end
|
||||
|
||||
rule parameter_list
|
||||
left_parenthesis parameter_list:( name:parameter? (comma name:parameter)* ) right_parenthesis
|
||||
end
|
||||
|
||||
root call_site
|
||||
end
|
@ -5,8 +5,6 @@ module Parser
|
||||
|
||||
# obviously a work in progress !!
|
||||
|
||||
Citrus.require "parser/basic"
|
||||
Citrus.require "parser/expression"
|
||||
Citrus.require "parser/statement"
|
||||
Citrus.require "parser/bosl"
|
||||
|
||||
end
|
||||
|
@ -1,58 +0,0 @@
|
||||
grammar Statement
|
||||
include Expression
|
||||
|
||||
rule type
|
||||
(typ:("int" | "ref") space*) { capture(:typ).to_s }
|
||||
end
|
||||
|
||||
rule typed_arg
|
||||
(type name_expression) {
|
||||
Ast::TypedName.new(capture(:type).value , capture(:name_expression).value.name)
|
||||
}
|
||||
end
|
||||
|
||||
rule variable_definition
|
||||
(typed_arg ("=" space* value_expression)?) {
|
||||
type = capture(:typed_arg).value
|
||||
value = capture(:value_expression) ? capture(:value_expression).value : nil
|
||||
var = Ast::VariableDefinition.new(type.type , type.name , value)
|
||||
}
|
||||
end
|
||||
|
||||
rule assignment
|
||||
(name_expression "=" space* value_expression){
|
||||
Ast::AssignmentExpression.new( capture(:name_expression).value.name , capture(:value_expression).value)
|
||||
}
|
||||
end
|
||||
|
||||
rule conditional
|
||||
(keyword_if left_parenthesis value_expression right_parenthesis
|
||||
body
|
||||
keyword_end) {
|
||||
Ast::IfExpression.new( capture(:value_expression).value , capture(:body).value , nil)
|
||||
}
|
||||
end
|
||||
|
||||
rule while
|
||||
keyword_while left_parenthesis value_expression right_parenthesis keyword_do
|
||||
body
|
||||
keyword_end
|
||||
end
|
||||
|
||||
rule return
|
||||
keyword_return value_expression newline
|
||||
end
|
||||
|
||||
rule body
|
||||
(statement+){
|
||||
captures(:statement).collect{|u| u.value }
|
||||
}
|
||||
end
|
||||
|
||||
rule statement
|
||||
conditional | while | return | variable_definition | assignment
|
||||
end
|
||||
|
||||
root statement
|
||||
|
||||
end
|
Reference in New Issue
Block a user