Skip to content

Commit

Permalink
minimising the number of bottom nonterminals by utilising token infor…
Browse files Browse the repository at this point in the history
…mation

git-svn-id: https://slps.svn.sourceforge.net/svnroot/slps@971 ab42f6e0-554d-0410-b580-99e487e6eeb2
  • Loading branch information
grammarware committed Mar 11, 2011
1 parent f095954 commit 4962350
Show file tree
Hide file tree
Showing 12 changed files with 676 additions and 125 deletions.
107 changes: 0 additions & 107 deletions topics/extraction/antlr/ANTLR.rsc

This file was deleted.

125 changes: 125 additions & 0 deletions topics/extraction/antlr/ANTLR3.rsc
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
module ANTLR3

import IO;
import SourceEditor;

//syntax Grammar = Comment? "grammar" Name ";" HeaderSection* Rule+ LayoutList?;
syntax ANTLR3Grammar = "grammar" ANTLR3Name ";" ANTLR3HeaderSection* ANTLR3Rule+;

syntax ANTLR3HeaderSection = ANTLR3UselessHeaderSection | ANTLR3TokensHeaderSection;
syntax ANTLR3UselessHeaderSection = @category="Comment" ANTLR3SectionName ANTLR3CurlyBlock;
syntax ANTLR3TokensHeaderSection = "tokens" "{" ANTLR3TokenDefinition+ "}";

syntax ANTLR3TokenDefinition
= ANTLR3RealTokenDefinition
| ANTLR3FakeTokenDefinition
| ANTLR3UselessTokenDefinition;
syntax ANTLR3UselessTokenDefinition = ANTLR3Name ";" ;
syntax ANTLR3RealTokenDefinition = ANTLR3Name "=" ANTLR3QuotedBlock ";" ;
syntax ANTLR3FakeTokenDefinition = ANTLR3Name ":" ANTLR3QuotedBlock ";" ;

syntax ANTLR3SectionName
= "options"
| "@header"
| "@members"
| "@lexer::header"
| "@lexer::members"
;

syntax ANTLR3Rule = "fragment"? ANTLR3Name ANTLR3Arguments? ANTLR3Options? ":" {ANTLR3Alternative "|"}+ ";";

syntax ANTLR3Alternative = ANTLR3Predicate? ANTLR3Symbol* ANTLR3Rewrite? ANTLR3OptionalCurlyBlock?;

syntax ANTLR3Symbol
= ANTLR3Name ANTLR3Arguments?
| ANTLR3Symbol ANTLR3Modifier
| ANTLR3Name "=" ANTLR3Symbol
| ANTLR3OptionsSemicolon? ANTLR3Terminal
| "~"? "(" {ANTLR3Alternative "|"}+ ")" ANTLR3CurlyBlock?
| @category="Variable" ANTLR3QuotedBlock ".." ANTLR3QuotedBlock
;

syntax ANTLR3Modifier = "*" | "?" | "+" | ANTLR3UselessModifier;
syntax ANTLR3UselessModifier = "!" | "^";
syntax ANTLR3Terminal = @category="Variable" ANTLR3QuotedBlock;
syntax ANTLR3Name = @category="Constant" lex [A-Za-z0-9_@]+ # [A-Za-z0-9_@];

syntax ANTLR3Predicate = @category="Comment" ANTLR3ParenthesisBlock "=\>";
syntax ANTLR3Arguments = @category="Comment" ANTLR3SquareBlock;
syntax ANTLR3Rewrite = @category="Comment" "-\>" ANTLR3RewrittenTree;
syntax ANTLR3RewrittenTree = "^" ANTLR3ParenthesisBlock | ANTLR3Name;
syntax ANTLR3OptionsSemicolon = @category="Comment" ANTLR3Options ":";
syntax ANTLR3Options = @category="Comment" "options" ANTLR3CurlyBlock;
syntax ANTLR3OptionalCurlyBlock = @category="Comment" ANTLR3CurlyBlock "?"?;

syntax ANTLR3Layout
= lex [\ \t\n\r]
| @category="Comment" lex "//" ![\n]* [\n]
| @category="Comment" lex "/*" ANTLR3CommentChar* "*/" ;

syntax ANTLR3CommentChar = lex ![*] | lex ANTLR3Asterisk ;
syntax ANTLR3Asterisk = lex [*] # [/] ;
layout ANTLR3LayoutList = lex ANTLR3Layout* # [\ \t\n\r] # "/*" # "//";

syntax ANTLR3CurlyBlock = "{" ANTLR3CurlyBlockElement* "}";
syntax ANTLR3CurlyBlockElement = ![{}] | ANTLR3CurlyBlock;
syntax ANTLR3SquareBlock = "[" ANTLR3SquareBlockElement* "]";
syntax ANTLR3SquareBlockElement = ![\[\]] | ANTLR3SquareBlock;
syntax ANTLR3ParenthesisBlock = "(" ANTLR3ParenthesisBlockElement* ")";
syntax ANTLR3ParenthesisBlockElement = ![()] | ANTLR3ParenthesisBlock;
syntax ANTLR3QuotedBlock = [\'] ANTLR3QuotedBlockSymbol* [\'];
syntax ANTLR3QuotedBlockSymbol = lex ![\'\\] | lex [\\][\'rtnu\\\"];

public ANTLR3Grammar agrammar(str i, loc s){return parse(#ANTLR3Grammar, i, s);}

public void enableAntlr()
{
registerLanguage("ANTLR3","ag",agrammar);
registerContributions("ANTLR3",{popup(menu("ANTLR",[edit("simplify!", simplify2str)]))});
}

public ANTLR3Grammar simplify(ANTLR3Grammar g, loc z)
{
return top-down visit(g)
{
//case `grammar <ANTLR3Name n> ; <ANTLR3HeaderSection+ _> <ANTLR3Rule+ rs>`
// => (ANTLRGrammar)`grammar <ANTLR3Name n>; <ANTLR3Rule+ rs>`
// syntax ANTLR3HeaderSection = ANTLR3UselessHeaderSection | ANTLR3TokensHeaderSection;
//case (ANTLR3HeaderSection+)`<ANTLR3UselessHeaderSection _> <ANTLR3TokensHeaderSection t>` => (ANTLR3HeaderSection+)`<ANTLR3TokensHeaderSection t>`
//case (ANTLR3HeaderSection+)`<ANTLR3TokensHeaderSection t> <ANTLR3UselessHeaderSection _>` => (ANTLR3HeaderSection+)`<ANTLR3TokensHeaderSection t>`
case (ANTLR3TokenDefinition)`<ANTLR3Name n> = <ANTLR3QuotedBlock v> ;`
=> (ANTLR3TokenDefinition)`<ANTLR3Name n> : <ANTLR3QuotedBlock v> ;`
case (ANTLR3Rule)`fragment <ANTLR3Name n> <ANTLR3Arguments? _> <ANTLR3Options? _> : <{ANTLR3Alternative "|"}+ as>;`
=> (ANTLR3Rule)`<ANTLR3Name n>: <{ANTLR3Alternative "|"}+ as>;`
case (ANTLR3Rule)`<ANTLR3Name n> <ANTLR3Arguments _> <ANTLR3Options? _> : <{ANTLR3Alternative "|"}+ as>;`
=> (ANTLR3Rule)`<ANTLR3Name n>: <{ANTLR3Alternative "|"}+ as>;`
case (ANTLR3Rule)`<ANTLR3Name n> <ANTLR3Options _> : <{ANTLR3Alternative "|"}+ as>;`
=> (ANTLR3Rule)`<ANTLR3Name n>: <{ANTLR3Alternative "|"}+ as>;`
case (ANTLR3Alternative)`<ANTLR3Predicate _> <ANTLR3Symbol+ ss> <ANTLR3Rewrite? _> <ANTLR3OptionalCurlyBlock? _>`
=> (ANTLR3Alternative)`<ANTLR3Symbol+ ss>`
case (ANTLR3Alternative)`<ANTLR3Symbol+ ss> <ANTLR3Rewrite _> <ANTLR3OptionalCurlyBlock? _>`
=> (ANTLR3Alternative)`<ANTLR3Symbol+ ss>`
case (ANTLR3Alternative)`<ANTLR3Symbol+ ss> <ANTLR3OptionalCurlyBlock _>`
=> (ANTLR3Alternative)`<ANTLR3Symbol+ ss>`
case (ANTLR3Alternative)`<ANTLR3Name n> <ANTLR3Arguments _>`
=> (ANTLR3Symbol)`<ANTLR3Name n>`
case (ANTLR3Alternative)`<ANTLR3Symbol* s> <ANTLR3Rewrite r>`
=> (ANTLR3Symbol)`<ANTLR3Symbol* s>`
case (ANTLR3Alternative)`<ANTLR3Symbol s> <ANTLR3UselessModifier _>`
=> s
case (ANTLR3Alternative)`<ANTLR3OptionsSemicolon _> <ANTLR3Terminal t>`
=> (ANTLR3Symbol)`<ANTLR3Terminal t>`
};
}

public str simplify2str(ANTLR3Grammar g, loc z)
{
return "<simplify(g,z)>";
}

// import SourceEditor;
// import ANTLR;
// registerLanguage("ANTLR","ag",agrammar);
// registerContributions("ANTLR",{popup(menu("ANTLR",[edit("simplify!", simplify2str)]))});
// a=parse(#ANTLRGrammar,|project://antlr/src/Java.ag|);
// writeTextValueFile(|project://antlr/src/Test.ag|,parse(#ANTLRGrammar,|project://antlr/src/Java.ag|));
15 changes: 10 additions & 5 deletions topics/grammars/java/antlr-java-5/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,19 @@ all:
make build

build:
java -cp ${CLASSPATH}:../../../../download/antlrworks-1.1.7.jar:../../../extraction/antlr slps.antlr2bgf.Tool parr/Java.stripped.g parr.bgf
java -cp ${CLASSPATH}:../../../../download/antlrworks-1.1.7.jar:../../../extraction/antlr slps.antlr2bgf.Tool habelitz/Java.stripped.g habelitz.ext.bgf
java -cp ${CLASSPATH}:../../../../download/antlrworks-1.1.7.jar:../../../extraction/antlr slps.antlr2bgf.Tool parr/Java.stripped.g parr.ext.bgf
java -cp ${CLASSPATH}:../../../../download/antlrworks-1.1.7.jar:../../../extraction/antlr slps.antlr2bgf.Tool stahl/java.stripped.g stahl.ext.bgf
java -cp ${CLASSPATH}:../../../../download/antlrworks-1.1.7.jar:../../../extraction/antlr slps.antlr2bgf.Tool studman/java15.stripped.g studman.ext.bgf
../../../../shared/tools/xbgf post-extraction.xbgf habelitz.ext.bgf habelitz.bgf
../../../../shared/tools/xbgf post-extraction.xbgf studman.ext.bgf studman.bgf
../../../../shared/tools/xbgf post-extraction.xbgf stahl.ext.bgf stahl.bgf
rm habelitz.ext.bgf stahl.ext.bgf studman.ext.bgf
../../../../shared/tools/xbgf habelitz/post-extraction.xbgf habelitz.ext.bgf habelitz.fix.bgf
../../../../shared/tools/xbgf parr/post-extraction.xbgf parr.ext.bgf parr.fix.bgf
../../../../shared/tools/xbgf stahl/post-extraction.xbgf stahl.ext.bgf stahl.fix.bgf
../../../../shared/tools/xbgf studman/post-extraction.xbgf studman.ext.bgf studman.fix.bgf
../../../../shared/tools/subgrammar habelitz.fix.bgf javaSource habelitz.bgf
../../../../shared/tools/subgrammar parr.fix.bgf compilationUnit parr.bgf
../../../../shared/tools/subgrammar stahl.fix.bgf compilationUnit stahl.bgf
../../../../shared/tools/subgrammar studman.fix.bgf compilationUnit studman.bgf
rm *.ext.bgf *.fix.bgf

test:
ls -1 *.bgf | xargs -n1 ../../../../shared/tools/validate bgf
Expand Down
100 changes: 100 additions & 0 deletions topics/grammars/java/antlr-java-5/habelitz/Java.stripped.g
Original file line number Diff line number Diff line change
@@ -1,4 +1,104 @@
grammar Java;
AND : '&' ;
AND_ASSIGN : '&=' ;
ASSIGN : '=' ;
AT : '@' ;
BIT_SHIFT_RIGHT : '>>>' ;
BIT_SHIFT_RIGHT_ASSIGN : '>>>=' ;
COLON : ':' ;
COMMA : ',' ;
DEC : '--' ;
DIV : '/' ;
DIV_ASSIGN : '/=' ;
DOT : '.' ;
DOTSTAR : '.*' ;
ELLIPSIS : '...' ;
EQUAL : '==' ;
GREATER_OR_EQUAL : '>=' ;
GREATER_THAN : '>' ;
INC : '++' ;
LBRACK : '[' ;
LCURLY : '{' ;
LESS_OR_EQUAL : '<=' ;
LESS_THAN : '<' ;
LOGICAL_AND : '&&' ;
LOGICAL_NOT : '!' ;
LOGICAL_OR : '||' ;
LPAREN : '(' ;
MINUS : '-' ;
MINUS_ASSIGN : '-=' ;
MOD : '%' ;
MOD_ASSIGN : '%=' ;
NOT : '~' ;
NOT_EQUAL : '!=' ;
OR : '|' ;
OR_ASSIGN : '|=' ;
PLUS : '+' ;
PLUS_ASSIGN : '+=' ;
QUESTION : '?' ;
RBRACK : ']' ;
RCURLY : '}' ;
RPAREN : ')' ;
SEMI : ';' ;
SHIFT_LEFT : '<<' ;
SHIFT_LEFT_ASSIGN : '<<=' ;
SHIFT_RIGHT : '>>' ;
SHIFT_RIGHT_ASSIGN : '>>=' ;
STAR : '*' ;
STAR_ASSIGN : '*=' ;
XOR : '^' ;
XOR_ASSIGN : '^=' ;
ABSTRACT : 'abstract' ;
ASSERT : 'assert' ;
BOOLEAN : 'boolean' ;
BREAK : 'break' ;
BYTE : 'byte' ;
CASE : 'case' ;
CATCH : 'catch' ;
CHAR : 'char' ;
CLASS : 'class' ;
CONTINUE : 'continue' ;
DEFAULT : 'default' ;
DO : 'do' ;
DOUBLE : 'double' ;
ELSE : 'else' ;
ENUM : 'enum' ;
EXTENDS : 'extends' ;
FALSE : 'false' ;
FINAL : 'final' ;
FINALLY : 'finally' ;
FLOAT : 'float' ;
FOR : 'for' ;
IF : 'if' ;
IMPLEMENTS : 'implements' ;
INSTANCEOF : 'instanceof' ;
INTERFACE : 'interface' ;
IMPORT : 'import' ;
INT : 'int' ;
LONG : 'long' ;
NATIVE : 'native' ;
NEW : 'new' ;
NULL : 'null' ;
PACKAGE : 'package' ;
PRIVATE : 'private' ;
PROTECTED : 'protected' ;
PUBLIC : 'public' ;
RETURN : 'return' ;
SHORT : 'short' ;
STATIC : 'static' ;
STRICTFP : 'strictfp' ;
SUPER : 'super' ;
SWITCH : 'switch' ;
SYNCHRONIZED : 'synchronized' ;
THIS : 'this' ;
THROW : 'throw' ;
THROWS : 'throws' ;
TRANSIENT : 'transient' ;
TRUE : 'true' ;
TRY : 'try' ;
VOID : 'void' ;
VOLATILE : 'volatile' ;
WHILE : 'while' ;
javaSource : compilationUnit ;
compilationUnit : annotationList packageDeclaration? importDeclaration* typeDecls* ;
typeDecls : typeDeclaration | SEMI ;
Expand Down
Loading

0 comments on commit 4962350

Please sign in to comment.