📄 t042ast.g
字号:
grammar t042ast;options { language = Python; output = AST;}tokens { VARDEF; FLOAT; EXPR; BLOCK; VARIABLE; FIELD; CALL; INDEX; FIELDACCESS;}@init {self.flag = False}r1 : INT ('+'^ INT)* ;r2 : 'assert'^ x=expression (':'! y=expression)? ';'! ;r3 : 'if'^ expression s1=statement ('else'! s2=statement)? ;r4 : 'while'^ expression statement ;r5 : 'return'^ expression? ';'! ;r6 : (INT|ID)+ ;r7 : INT -> ;r8 : 'var' ID ':' type -> ^('var' type ID) ;r9 : type ID ';' -> ^(VARDEF type ID) ;r10 : INT -> {CommonTree(CommonToken(type=FLOAT, text=$INT.text + ".0"))} ;r11 : expression -> ^(EXPR expression) | -> EXPR ;r12 : ID (',' ID)* -> ID+ ;r13 : type ID (',' ID)* ';' -> ^(type ID+) ;r14 : expression? statement* type+ -> ^(EXPR expression? statement* type+) ;r15 : INT -> INT INT ;r16 : 'int' ID (',' ID)* -> ^('int' ID)+ ;r17 : 'for' '(' start=statement ';' expression ';' next=statement ')' statement -> ^('for' $start expression $next statement) ;r18 : t='for' -> ^(BLOCK) ;r19 : t='for' -> ^(BLOCK[$t]) ;r20 : t='for' -> ^(BLOCK[$t,"FOR"]) ;r21 : t='for' -> BLOCK ;r22 : t='for' -> BLOCK[$t] ;r23 : t='for' -> BLOCK[$t,"FOR"] ;r24 : r=statement expression -> ^($r expression) ;r25 : r+=statement (',' r+=statement)+ expression -> ^($r expression) ;r26 : r+=statement (',' r+=statement)+ -> ^(BLOCK $r+) ;r27 : r=statement expression -> ^($r ^($r expression)) ;r28 : ('foo28a'|'foo28b') -> ;r29 : (r+=statement)* -> ^(BLOCK $r+) ;r30 : statement* -> ^(BLOCK statement?) ;r31 : modifier type ID ('=' expression)? ';' -> {self.flag == 0}? ^(VARDEF ID modifier* type expression?) -> {self.flag == 1}? ^(VARIABLE ID modifier* type expression?) -> ^(FIELD ID modifier* type expression?) ;r32[which] : ID INT -> {which==1}? ID -> {which==2}? INT -> // yield nothing as else-clause ;r33 : modifiers! statement ;r34 : modifiers! r34a[$modifiers.tree] //| modifiers! r33b[$modifiers.tree] ;r34a[mod] : 'class' ID ('extends' sup=type)? ( 'implements' i+=type (',' i+=type)*)? '{' statement* '}' -> ^('class' ID {$mod} ^('extends' $sup)? ^('implements' $i+)? statement* ) ;r35 : '{' 'extends' (sup=type)? '}' -> ^('extends' $sup)? ;r36 : 'if' '(' expression ')' s1=statement ( 'else' s2=statement -> ^('if' ^(EXPR expression) $s1 $s2) | -> ^('if' ^(EXPR expression) $s1) ) ;r37 : (INT -> INT) ('+' i=INT -> ^('+' $r37 $i) )* ;r38 : INT ('+'^ INT)* ;r39 : (primary->primary) // set return tree to just primary ( '(' arg=expression ')' -> ^(CALL $r39 $arg) | '[' ie=expression ']' -> ^(INDEX $r39 $ie) | '.' p=primary -> ^(FIELDACCESS $r39 $p) )* ;r40 : (INT -> INT) ( ('+' i+=INT)* -> ^('+' $r40 $i*) ) ';' ;r41 : (INT -> INT) ( ('+' i=INT) -> ^($i $r41) )* ';' ;r42 : ids+=ID (','! ids+=ID)* ;r43 returns [res] : ids+=ID! (','! ids+=ID!)* {$res = [id.text for id in $ids]} ;r44 : ids+=ID^ (','! ids+=ID^)* ;r45 : primary^ ;r46 returns [res] : ids+=primary! (','! ids+=primary!)* {$res = [id.start.text for id in $ids]} ;r47 : ids+=primary (','! ids+=primary)* ;r48 : ids+=. (','! ids+=.)* ;r49 : .^ ID ;r50 : ID -> ^({CommonTree(CommonToken(type=FLOAT, text="1.0"))} ID) ;/** templates tested: tokenLabelPropertyRef_tree*/r51 returns [res] : ID t=ID ID { $res = $t.tree } ;/** templates tested: rulePropertyRef_tree*/r52 returns [res]@after { $res = $tree} : ID ;/** templates tested: ruleLabelPropertyRef_tree*/r53 returns [res] : t=primary { $res = $t.tree } ;/** templates tested: ruleSetPropertyRef_tree*/r54 returns [res]@after { $tree = $t.tree;} : ID t=expression ID ;/** backtracking */r55options { backtrack=true; k=1; } : (modifier+ INT)=> modifier+ expression | modifier+ statement ;/** templates tested: rewriteTokenRef with len(args)>0*/r56 : t=ID* -> ID[$t,'foo'] ;/** templates tested: rewriteTokenRefRoot with len(args)>0*/r57 : t=ID* -> ^(ID[$t,'foo']) ;/** templates tested: ???*/r58 : ({CommonTree(CommonToken(type=FLOAT, text="2.0"))})^ ;primary : ID ;expression : r1 ;statement : 'fooze' | 'fooze2' ;modifiers : modifier+ ;modifier : 'public' | 'private' ;type : 'int' | 'bool' ;ID : 'a'..'z' + ;INT : '0'..'9' +;WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -