Я хотел бы реализовать «основной» блок в моем языке программирования, созданном с помощью ANTLR4.Таким образом, может существовать только одна функция с именем «main» и что потребуется для запуска кода.Кроме того, должны работать только функции, вызываемые из «основного» блока.
grammar TL;
parse
: block EOF
;
block
: ( statement | functionDecl )* ( Return expression )?
;
statement
: assignment
| functionCall
| ifStatement
| forStatement
| whileStatement
;
assignment
: Identifier indexes?'=' expression
;
functionCall
: Identifier '(' exprList? ')' #identifierFunctionCall
| Spausdink '(' expression? ')' #printlnFunctionCall
| Convert '(' expression ',' expression ',' expression ')' #convertFunctionCall
;
ifStatement
: ifas elseIfStat* elseStat? '}'
;
ifas
: If '(' expression ')' '{' block
;
elseIfStat
: Else If '(' expression ')' '{' block
;
elseStat
: Else '{' block
;
functionDecl
: View Function Identifier '(' idList? ')' '{' block '}'
;
forStatement
: Floop '(' Identifier '=' expression ',' expression ',' expression ')' '{' block '}'
;
whileStatement
: Wloop '(' expression ')' '{' block '}'
;
idList
: Identifier ( ',' Identifier )*
;
exprList
: expression ( ',' expression )*
;
expression
: '-' expression #unaryMinusExpression
| '!' expression #notExpression
| <assoc=right> expression '^' expression #powerExpression
| expression op=( '*' | '/' | '%' ) expression #multExpression
| expression op=( '+' | '-' ) expression #addExpression
| expression op=( '>=' | '<=' | '>' | '<' ) expression #compExpression
| expression op=( '==' | '!=' ) expression #eqExpression
| expression '&&' expression #andExpression
| expression '||' expression #orExpression
| expression '?' expression ':' expression #ternaryExpression
| Number #numberExpression
| Bool #boolExpression
| Null #nullExpression
| functionCall indexes? #functionCallExpression
| list indexes? #listExpression
| Identifier indexes? #identifierExpression
| String indexes? #stringExpression
| '(' expression ')' indexes? #expressionExpression
| Input '(' String? ')' #inputExpression
;
list
: '[' exprList? ']'
;
indexes
: ( '[' expression ']' )+
;
Spausdink : 'spausdink';
Convert : 'convert';
For : 'for';
While : 'while';
Input : 'input';
View : 'view';
If : 'if';
Else : 'else';
Return : 'return';
Floop : 'floop';
Wloop : 'wloop';
Null : 'null';
Function : 'function';
Or : '||';
And : '&&';
Equals : '==';
NEquals : '!=';
GTEquals : '>=';
LTEquals : '<=';
Pow : '^';
Excl : '!';
GT : '>';
LT : '<';
Add : '+';
Subtract : '-';
Multiply : '*';
Divide : '/';
Modulus : '%';
OBrace : '{';
CBrace : '}';
OBracket : '[';
CBracket : ']';
OParen : '(';
CParen : ')';
SColon : ';';
Assign : '=';
Comma : ',';
QMark : '?';
Colon : ':';
Bool
: 'true'
| 'false'
;
Number
: Int ( '.' Digit* )?
;
Identifier
: [a-zA-Z_] [a-zA-Z_0-9]*
;
String
: ["] ( ~["\r\n\\] | '\\' ~[\r\n] )* ["]
| ['] ( ~['\r\n\\] | '\\' ~[\r\n] )* [']
;
Comment
: ( '//' ~[\r\n]* | '/*' .*? '*/' ) -> skip
;
Space
: [ \t\r\n\u000C] -> skip
;
fragment Int
: [1-9] Digit*
| '0'
;
fragment Digit
: [0-9]
;
Кроме того, если есть код, который не является функцией вне «основного» блока, должно появиться сообщение об ошибке.
Я хотел бы, чтобы входной код выглядел следующим образом:
view function count (value) {
return value * 10
}
view function main() {
value = 1
value = count(value) // calling function
spausdink(value) // printing the value
return 0
}
Любая помощь или предложения будут оценены.
TLDR: Как добавить ограничения в грамматику кода, чтобы функцииможет вызываться только из функции main, должна быть функция main для запуска кода, в противном случае должна появиться ошибка.И код не может иметь две «основные» функции.