我想用ANTLR4创建的编程语言实现一个“ main”块。因此,只能有一个名为“ main”的函数,并且需要运行该代码。另外,只有从“ 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]
;
此外,如果“ main”块之外的代码不是函数,则应该给出错误。
我希望输入代码看起来像这样:
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”函数来运行代码,否则将出现错误。并且代码不能具有两个“主要”功能。