User defined functions with builtin functions [message #1846952] |
Sun, 10 October 2021 05:33  |
Eclipse User |
|
|
|
Hi
I am trying to make grammar that allows both user defined functions and language builtin function like in the example code bellow.
function mf(i)=i*3);
a=2*mf(2)
b=sin(45)*4;
c=mf(2)+sin(45);
sin(45) is a builtin function
I can do either a or b but not c
I simplify my grammar as i could . I try several thinks but i have to admit that my understanding of the Xtext grammar is limited to say the least. So my tries were more or less guesswork.
grammar org.xtext.example.test.Test with org.eclipse.xtext.common.Terminals
generate test "http://www.xtext.org/example/test/Test"
Package:
Statements;
Statements:
(statements+=Statement)+
;
Statement:
Assignment";"
|NamedFunctionDefinition
;
Number:
intPart=INT ("." decimalPart=INT)? |
"." decimalPart=INT
;
Expr returns Expression: ExprLet
;
ExprLet returns Expression:
(lets+=LetClause)* in=ExprIndexedHead
;
ExprIndexedHead returns Expression:
arr=ExprElvis ("[" index=ExprElvis "]")?
;
ExprElvis returns Expression:
cond=ExprOr ("?" if=ExprOr ":" else=ExprOr)?
;
ExprOr returns Expression:
ExprAnd ({Expression.left=current} op='||' right=ExprAnd)*
;
ExprAnd returns Expression:
ExprRel ({Expression.left=current} op='&&' right=ExprRel)*
;
ExprRel returns Expression:
ExprAdd ({Expression.left=current} op=('>='|'>'|'=='|'!='|'<='|'<') right=ExprAdd)*
;
ExprAdd returns Expression:
ExprMul ({Expression.left=current} op=('+' | '-') right=ExprMul)*
;
ExprMul returns Expression:
ExprUni ({Expression.left=current} op=('*' | '/' | '%') right=ExprUni)*
;
ExprUni returns Expression:
{Expression} (op=('-' | '!' | '+'))? right=ExprAtomic
;
ExprAtomic:
FunctionCall |
"(" Expr ")" |
{NumberLiteral} val=Number |
{StringLiteral} val=STRING |
VariableReference
;
VariableReference:
{BuiltinVar} "$" name=ID |
{UserVar} name=ID
;
LetClause:
{LetClause} "let""("ass=Assignments?")"
;
NamedFunctionDefinition:
"function" name=ID "(" params=Parameters? ")=" body=Expr ";"
;
BuiltinFunctions:
name=NamedBuiltin
;
// Works with user defined functios
//FunctionCall:
// function=[NamedFunctionDefinition|ID] "(" args=Arguments? ")"
//;
// Works with builtin functions
//FunctionCall:
// function=BuiltinFunctions "(" args=Arguments? ")"
//;
// This doesn't work
FunctionCall:
function=[BuiltinFunctions|NamedFunctionDefinition|ID] "(" args=Arguments? ")"
;
Parameters:
parameters+=Parameter ("," parameters+=Parameter)*
;
AssignmentOrExpr:
var=VariableReference ("=" tail=Expr) |
val=Expr
;
Parameter:
AssignmentOrExpr // TODO: Name from Assignment
;
Arguments:
arguments+=Argument ("," arguments+=Argument)*
;
Argument:
Expr | Assignment
;
Assignments:
assignments+=Assignment ("," assignments+=Assignment)*
;
Assignment:
name=VariableReference "=" val=Expr
;
NamedBuiltin:
'abs' | 'sin' | 'cos' | 'tan'
;
//
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.13655 seconds