📄 validator.g
字号:
tree grammar Validator;options{ tokenVocab = CMinus; ASTLabelType = CommonTree;}@header{ import java.util.HashMap; import java.util.Vector; import java.util.Map; import java.io.*;}@members{ }program @init{ Main.symbols.reset_globals();}: ^(PROGRAM ^(VARIABLES varDecl*) ^(FUNCTIONS funDecl*) call) EOF ;funDecl : ^(FUNCTION type=TYPE name=ID ^(PARAMATERS .*) {Main.symbols.enter_frame($name.text);} block {Main.symbols.exit_frame();}) ; varDecl : ^(VARDEF TYPE name=ID) {Main.symbols.declare_variable($name.text,$TYPE.text);} | ^(ARRDEF TYPE name=ID size=INT) {Main.symbols.declare_array($name.text,$TYPE.text,Integer.parseInt($size.text));} ; block@init{ Main.symbols.enter_block();}@after{ Main.symbols.exit_block();} : ^(BLOCK ^(VARIABLES varDecl*) ^(STMTS stmt*)) ; stmt : expr | ^(RETURN expr) | ^(READ name=ID) {Main.symbols.test_declared($name.text);} | ^(WRITE expr) | WRITELN | BREAK | ifStmt | whileStmt | block | NOP ; whileStmt : ^(WHILE expr stmt) ;ifStmt : ^(IF ^(EXPR expr) stmt stmt) ; expr : ^(('or'|'||') expr expr) | ^(('and'|'&&') expr expr) | ^('==' expr expr) | ^('!=' expr expr) | ^('>' expr expr) | ^('<' expr expr) | ^('>=' expr expr) | ^('<=' expr expr) | ^('<>' expr expr) | ^('+' expr expr) | ^('-' expr expr) | ^('*' expr expr) | ^('/' expr expr) | ^(NEGATE expr) | ^(NOT expr) | ^(NUM INT) | ^(VAR ID) {Main.symbols.test_declared($ID.text);} | ^(INDEX ID expr) {Main.symbols.test_declared($ID.text);} | ^(PREFIX ^(VAR ID) ^(NUM INT)) {Main.symbols.test_declared($ID.text);} | ^(POSTFIX ^(VAR ID) ^(NUM INT)) {Main.symbols.test_declared($ID.text);} | call | ^(ASSIGN ID expr) {Main.symbols.test_declared($ID.text);Main.symbols.test_assign($ID.text);} | ^(ASSIGN ^(INDEX ID expr) expr) {Main.symbols.test_declared($ID.text);Main.symbols.test_assign($ID.text);} ;call@init{ int arg_count=0;} : ^(CALL ID ^(EXPRLIST (expr {arg_count++;})*)) { Function fcn=Main.symbols.get_function($ID.text); if(fcn.params.size()!=arg_count){ Main.print_err("Invalid number of arguments to function '"+fcn.name+"'"); } } ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -