/* * Ruby is copyrighted free software by Yukihiro Matsumoto . * You can redistribute it and/or modify it under either the terms of the GPL * (see COPYING.txt file), or the conditions below: * * 1. You may make and give away verbatim copies of the source form of the * software without restriction, provided that you duplicate all of the * original copyright notices and associated disclaimers. * * 2. You may modify your copy of the software in any way, provided that * you do at least ONE of the following: * * a) place your modifications in the Public Domain or otherwise * make them Freely Available, such as by posting said * modifications to Usenet or an equivalent medium, or by allowing * the author to include your modifications in the software. * * b) use the modified software only within your corporation or * organization. * * c) rename any non-standard executables so the names do not conflict * with standard executables, which must also be provided. * * d) make other distribution arrangements with the author. * * 3. You may distribute the software in object code or executable * form, provided that you do at least ONE of the following: * * a) distribute the executables and library files of the software, * together with instructions (in the manual page or equivalent) * on where to get the original distribution. * * b) accompany the distribution with the machine-readable source of * the software. * * c) give non-standard executables non-standard names, with * instructions on where to get the original software distribution. * * d) make other distribution arrangements with the author. * * 4. You may modify and include the part of the software into any other * software (possibly commercial). But some files in the distribution * are not written by the author, so that they are not under this terms. * * They are gc.c(partly), utils.c(partly), regex.[ch], st.[ch] and some * files under the ./missing directory. See each file for the copying * condition. * * 5. The scripts and library files supplied as input to or produced as * output from the software do not automatically fall under the * copyright of the software, but belong to whomever generated them, * and may be sold commercially, and may be aggregated with this * software. * * 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. */ header { package ruby; } /** * PARSER **/ class P extends Parser; options { k = 6; buildAST = true; } imaginaryTokenDefinition: PROGRAM; program : ( classe | statement)* {#program = #(#[PROGRAM, "PROGRAM"], #program);} ; classe: "class"^ (IDENTIFIER | IDENTIFIER "<" IDENTIFIER ("<" IDENTIFIER!)*) (statement)* body_class "end" ; body_class : (definition)+ ; definition: (statement)* "def"^ IDENTIFIER (IDENTIFIER)* ( "("! (IDENTIFIER)+ (","! IDENTIFIER)* ")"! )* statement (statement)* "end" ; statement : ("if"^ | "while"^) condition (statement)+ "end" | "loop" "do"^ (statement)+ "end" | "yield"^ "("! (IDENTIFIER | instruction) ")"! | "return"^ ret | IDENTIFIER "="^ (NUMBER | IDENTIFIER | STRING) | IDENTIFIER "="^ instruction | IDENTIFIER "="^ "("! (IDENTIFIER | NUMBER | STRING) ")"! | IDENTIFIER "="^ "("! instruction ")"! | IDENTIFIER "="^ IDENTIFIER "("! (IDENTIFIER)+ (","! IDENTIFIER)* ")"! | IDENTIFIER ( "("! (IDENTIFIER | NUMBER)+ (","! (IDENTIFIER | NUMBER))* ")"! )* "do"^ "|"! IDENTIFIER "|"! (statement)* "end" | IDENTIFIER ; condition : "("! condition ")"! ((operator | booleano) (IDENTIFIER | NUMBER))? | IDENTIFIER booleano IDENTIFIER | IDENTIFIER booleano NUMBER | NUMBER booleano IDENTIFIER | NUMBER booleano NUMBER | instruction | IDENTIFIER booleano instruction ; instruction : NUMBER operator NUMBER | IDENTIFIER operator NUMBER | NUMBER operator IDENTIFIER | IDENTIFIER operator IDENTIFIER ; booleano : "<"^ | "<="^ | ">="^ | ">"^ | "=="^ | "%"^ | "&"^ | "|"^ ; ret : IDENTIFIER | NUMBER | instruction | "true" | "false" | "("! IDENTIFIER ")"! | "("! NUMBER ")"! | "("! "true" ")"! | "("! "false" ")"! ; operator : "/"^ | "*"^ | "+"^ | "-"^ | "%"^ ; /** * LEXER **/ class RubyLexer extends Lexer; options { k = 6; } WS : ' '{ _ttype = Token.SKIP; } ; LPAREN : '(' ; RPAREN : ')' ; LT : '<' ; LE : "<=" ; GE : ">=" ; GT : '>' ; EGUAL : "==" ; DIV : '/' ; MUL : '*' ; ASSIGN : '=' ; PLUS : '+' ; OR : '|' ; AND : '&' ; SUB : '-' ; MOD : '%' ; NUMBER : ('0'..'9')+ ; IDENTIFIER : ("@")* ('a'..'z'|'A'..'Z'|'.')+ (NUMBER)*; STRING : '"' (('a'..'z'|'A'..'Z')+)* '"' | '\'' (('a'..'z'|'A'..'Z')+)* '\''; NEWLINE : ( "\r\n" // DOS | '\r' // MAC | '\n' // Unix ); /** * PARSE TREE **/ class RubyParseTree extends TreeParser; program: #(PROGRAM (classe | statement)*) ; classe: #("class" (IDENTIFIER)* "<" (statement)* body_class "end") ; body_class: #("def" definition) ; definition: #("def" (IDENTIFIER)* "(" ")" "," (statement)* "end") ; statement: #("if" condition (statement)+ "end") | #("while" condition (statement)+ "end") | #("yield" "(" (IDENTIFIER | instruction) ")") // | #("return" ret) | #("=" IDENTIFIER (NUMBER | IDENTIFIER | STRING)) | #("=" IDENTIFIER instruction) | #("=" IDENTIFIER "(" (IDENTIFIER | NUMBER | STRING) ")") | #("=" IDENTIFIER "(" instruction ")") | #("=" IDENTIFIER IDENTIFIER "(" (IDENTIFIER)+ ("," IDENTIFIER)* ")") | #("do" IDENTIFIER ( "(" (IDENTIFIER | NUMBER)+ ("," (IDENTIFIER | NUMBER))* ")" )* "|" IDENTIFIER "|" (statement)* "end") ; condition: #("/" "(" condition ")" (IDENTIFIER | NUMBER)?) | #("*" "(" condition ")" (IDENTIFIER | NUMBER)?) | #("+" "(" condition ")" (IDENTIFIER | NUMBER)?) | #("-" "(" condition ")" (IDENTIFIER | NUMBER)?) | #("%" "(" condition ")" (IDENTIFIER | NUMBER)?) | #("<" "(" condition ")" (IDENTIFIER | NUMBER)?) | #("<" IDENTIFIER IDENTIFIER) | #("<" IDENTIFIER instruction) | #("<=" "(" condition ")" (IDENTIFIER | NUMBER)?) | #("<=" IDENTIFIER IDENTIFIER) | #("<=" IDENTIFIER instruction) | #(">=" "(" condition ")" (IDENTIFIER | NUMBER)?) | #(">=" IDENTIFIER IDENTIFIER) | #(">=" IDENTIFIER instruction) | #(">" "(" condition ")" (IDENTIFIER | NUMBER)?) | #(">" IDENTIFIER IDENTIFIER) | #(">" IDENTIFIER instruction) | #("==" "(" condition ")" (IDENTIFIER | NUMBER)?) | #("==" IDENTIFIER IDENTIFIER) | #("==" IDENTIFIER instruction) | #("%" "(" condition ")" (IDENTIFIER | NUMBER)?) | #("%" IDENTIFIER IDENTIFIER) | #("%" IDENTIFIER instruction) | #("&" "(" condition ")" (IDENTIFIER | NUMBER)?) | #("&" IDENTIFIER IDENTIFIER) | #("&" IDENTIFIER instruction) | #("|" "(" condition ")" (IDENTIFIER | NUMBER)?) | #("|" IDENTIFIER IDENTIFIER) | #("|" IDENTIFIER instruction) ; instruction: #("/" NUMBER NUMBER) | #("/" IDENTIFIER NUMBER) | #("/" NUMBER IDENTIFIER) | #("/" IDENTIFIER IDENTIFIER) | #("*" NUMBER NUMBER) | #("*" IDENTIFIER NUMBER) | #("*" NUMBER IDENTIFIER) | #("*" IDENTIFIER IDENTIFIER) | #("+" NUMBER NUMBER) | #("+" IDENTIFIER NUMBER) | #("+" NUMBER IDENTIFIER) | #("+" IDENTIFIER IDENTIFIER) | #("-" NUMBER NUMBER) | #("-" IDENTIFIER NUMBER) | #("-" NUMBER IDENTIFIER) | #("-" IDENTIFIER IDENTIFIER) | #("%" NUMBER NUMBER) | #("%" IDENTIFIER NUMBER) | #("%" NUMBER IDENTIFIER) | #("%" IDENTIFIER IDENTIFIER) ;