Как реализовать «основной» блок в грамматике ANTLR4? - PullRequest
0 голосов
/ 03 июня 2019

Я хотел бы реализовать «основной» блок в моем языке программирования, созданном с помощью 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 для запуска кода, в противном случае должна появиться ошибка.И код не может иметь две «основные» функции.

...