[11 - Antlr Parser] Implement more stuff

This commit is contained in:
2020-06-03 13:10:56 +02:00
parent bbe75b4f76
commit 6aa5e71f1e
7 changed files with 4461 additions and 31 deletions

9
.idea/Java.iml generated Normal file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

147
.idea/workspace.xml generated
View File

@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="a11aa5c4-505d-4bfb-9e81-72367c118bbe" name="Default Changelist" comment="" /> <list default="true" id="a11aa5c4-505d-4bfb-9e81-72367c118bbe" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/CC-Praxis-Antlr Parser fuer X-Leer/X.tokens" beforeDir="false" afterPath="$PROJECT_DIR$/CC-Praxis-Antlr Parser fuer X-Leer/X.tokens" afterDir="false" />
<change beforePath="$PROJECT_DIR$/CC-Praxis-Antlr Parser fuer X-Leer/src/de/dhbw/compiler/antlrxparser/X.g" beforeDir="false" afterPath="$PROJECT_DIR$/CC-Praxis-Antlr Parser fuer X-Leer/src/de/dhbw/compiler/antlrxparser/X.g" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -25,8 +29,43 @@
<property name="project.structure.proportion" value="0.15429688" /> <property name="project.structure.proportion" value="0.15429688" />
<property name="project.structure.side.proportion" value="0.2" /> <property name="project.structure.side.proportion" value="0.2" />
</component> </component>
<component name="RunManager" selected="JUnit.TestAntlrXScanner1.tokenID"> <component name="RunManager" selected="JUnit.TestAntlrXScanner1.tokenASSIGN">
<configuration name="TestAntlrXScanner1.tokenID" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true"> <configuration name="TestAntlrXParser1" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
<module name="CC-Praxis-Antlr Parser fuer X-Leer" />
<useClassPathOnly />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="de.dhbw.compiler.antlrxparser.test.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<option name="PACKAGE_NAME" value="de.dhbw.compiler.antlrxparser.test" />
<option name="MAIN_CLASS_NAME" value="de.dhbw.compiler.antlrxparser.test.TestAntlrXParser1" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="class" />
<option name="PARAMETERS" value="" />
<method v="2">
<option name="RunConfigurationTask" enabled="true" run_configuration_name="Run Antlr Builder" run_configuration_type="Application" />
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="TestAntlrXParser1.program00BeginEnd" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
<module name="CC-Praxis-Antlr Parser fuer X-Leer" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="de.dhbw.compiler.antlrxparser.test.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<option name="PACKAGE_NAME" value="de.dhbw.compiler.antlrxparser.test" />
<option name="MAIN_CLASS_NAME" value="de.dhbw.compiler.antlrxparser.test.TestAntlrXParser1" />
<option name="METHOD_NAME" value="program00BeginEnd" />
<option name="TEST_OBJECT" value="method" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="TestAntlrXScanner1" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
<module name="CC-Praxis-Antlr Parser fuer X-Leer" /> <module name="CC-Praxis-Antlr Parser fuer X-Leer" />
<useClassPathOnly /> <useClassPathOnly />
<extension name="coverage"> <extension name="coverage">
@@ -37,21 +76,81 @@
</extension> </extension>
<option name="PACKAGE_NAME" value="de.dhbw.compiler.antlrxparser.test" /> <option name="PACKAGE_NAME" value="de.dhbw.compiler.antlrxparser.test" />
<option name="MAIN_CLASS_NAME" value="de.dhbw.compiler.antlrxparser.test.TestAntlrXScanner1" /> <option name="MAIN_CLASS_NAME" value="de.dhbw.compiler.antlrxparser.test.TestAntlrXScanner1" />
<option name="METHOD_NAME" value="tokenID" /> <option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="class" />
<option name="PARAMETERS" value="" />
<method v="2">
<option name="RunConfigurationTask" enabled="true" run_configuration_name="Run Antlr Builder" run_configuration_type="Application" />
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="TestAntlrXScanner1.tokenASSIGN" type="JUnit" factoryName="JUnit" nameIsGenerated="true">
<module name="CC-Praxis-Antlr Parser fuer X-Leer" />
<useClassPathOnly />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="de.dhbw.compiler.antlrxparser.test.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<option name="PACKAGE_NAME" value="de.dhbw.compiler.antlrxparser.test" />
<option name="MAIN_CLASS_NAME" value="de.dhbw.compiler.antlrxparser.test.TestAntlrXScanner1" />
<option name="METHOD_NAME" value="tokenASSIGN" />
<option name="TEST_OBJECT" value="method" /> <option name="TEST_OBJECT" value="method" />
<option name="PARAMETERS" value="" /> <option name="PARAMETERS" value="" />
<method v="2"> <method v="2">
<option name="RunConfigurationTask" enabled="true" /> <option name="RunConfigurationTask" enabled="true" run_configuration_name="Run Antlr Builder" run_configuration_type="Application" />
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="TestAntlrXScanner1.tokenREAD" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
<module name="CC-Praxis-Antlr Parser fuer X-Leer" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="de.dhbw.compiler.antlrxparser.test.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<option name="PACKAGE_NAME" value="de.dhbw.compiler.antlrxparser.test" />
<option name="MAIN_CLASS_NAME" value="de.dhbw.compiler.antlrxparser.test.TestAntlrXScanner1" />
<option name="METHOD_NAME" value="tokenREAD" />
<option name="TEST_OBJECT" value="method" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="TestAntlrXScanner1.tokenStringConst" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
<module name="CC-Praxis-Antlr Parser fuer X-Leer" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="de.dhbw.compiler.antlrxparser.test.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<option name="PACKAGE_NAME" value="de.dhbw.compiler.antlrxparser.test" />
<option name="MAIN_CLASS_NAME" value="de.dhbw.compiler.antlrxparser.test.TestAntlrXScanner1" />
<option name="METHOD_NAME" value="tokenStringConst" />
<option name="TEST_OBJECT" value="method" />
<method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>
</configuration> </configuration>
<list> <list>
<item itemvalue="Application.Run Antlr Builder" /> <item itemvalue="Application.Run Antlr Builder" />
<item itemvalue="JUnit.TestAntlrXScanner1.tokenID" /> <item itemvalue="JUnit.TestAntlrXScanner1" />
<item itemvalue="JUnit.TestAntlrXScanner1.tokenASSIGN" />
<item itemvalue="JUnit.TestAntlrXScanner1.tokenREAD" />
<item itemvalue="JUnit.TestAntlrXParser1" />
<item itemvalue="JUnit.TestAntlrXParser1.program00BeginEnd" />
<item itemvalue="JUnit.TestAntlrXScanner1.tokenStringConst" />
</list> </list>
<recent_temporary> <recent_temporary>
<list> <list>
<item itemvalue="JUnit.TestAntlrXScanner1.tokenID" /> <item itemvalue="JUnit.TestAntlrXScanner1.tokenStringConst" />
<item itemvalue="JUnit.TestAntlrXScanner1" />
<item itemvalue="JUnit.TestAntlrXParser1.program00BeginEnd" />
<item itemvalue="JUnit.TestAntlrXParser1" />
<item itemvalue="JUnit.TestAntlrXScanner1.tokenREAD" />
</list> </list>
</recent_temporary> </recent_temporary>
</component> </component>
@@ -67,6 +166,7 @@
<updated>1591172713288</updated> <updated>1591172713288</updated>
<workItem from="1591172719978" duration="202000" /> <workItem from="1591172719978" duration="202000" />
<workItem from="1591172941402" duration="220000" /> <workItem from="1591172941402" duration="220000" />
<workItem from="1591174233890" duration="8126000" />
</task> </task>
<servers /> <servers />
</component> </component>
@@ -78,26 +178,39 @@
<screen x="0" y="0" width="1440" height="900" /> <screen x="0" y="0" width="1440" height="900" />
</state> </state>
<state x="208" y="31" key="#Project_Structure/0.0.1440.900@0.0.1440.900" timestamp="1591172830001" /> <state x="208" y="31" key="#Project_Structure/0.0.1440.900@0.0.1440.900" timestamp="1591172830001" />
<state x="184" y="112" key="#com.intellij.execution.impl.EditConfigurationsDialog" timestamp="1591172899381"> <state x="570" y="121" key="#TestAntlrXScanner1.tokenASSIGN" timestamp="1591175187591">
<screen x="0" y="0" width="1440" height="900" /> <screen x="0" y="0" width="1920" height="1040" />
</state>
<state x="570" y="121" key="#TestAntlrXScanner1.tokenASSIGN/0.0.1920.1040@0.0.1920.1040" timestamp="1591175187591" />
<state x="245" y="129" key="#com.intellij.execution.impl.EditConfigurationsDialog" timestamp="1591178569825">
<screen x="0" y="0" width="1920" height="1040" />
</state> </state>
<state x="184" y="112" key="#com.intellij.execution.impl.EditConfigurationsDialog/0.0.1440.900@0.0.1440.900" timestamp="1591172899381" /> <state x="184" y="112" key="#com.intellij.execution.impl.EditConfigurationsDialog/0.0.1440.900@0.0.1440.900" timestamp="1591172899381" />
<state width="1398" height="245" key="GridCell.Tab.0.bottom" timestamp="1591173185826"> <state x="245" y="129" key="#com.intellij.execution.impl.EditConfigurationsDialog/0.0.1920.1040@0.0.1920.1040" timestamp="1591178569825" />
<screen x="0" y="0" width="1440" height="900" /> <state x="92" y="92" width="1736" height="856" key="#com.intellij.execution.junit2.states.ComparisonFailureState$DiffDialog" timestamp="1591178570191">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state x="92" y="92" width="1736" height="856" key="#com.intellij.execution.junit2.states.ComparisonFailureState$DiffDialog/0.0.1920.1040@0.0.1920.1040" timestamp="1591178570191" />
<state width="914" height="268" key="GridCell.Tab.0.bottom" timestamp="1591182426442">
<screen x="0" y="0" width="1920" height="1040" />
</state> </state>
<state width="1398" height="245" key="GridCell.Tab.0.bottom/0.0.1440.900@0.0.1440.900" timestamp="1591173185826" /> <state width="1398" height="245" key="GridCell.Tab.0.bottom/0.0.1440.900@0.0.1440.900" timestamp="1591173185826" />
<state width="1398" height="245" key="GridCell.Tab.0.center" timestamp="1591173185825"> <state width="914" height="268" key="GridCell.Tab.0.bottom/0.0.1920.1040@0.0.1920.1040" timestamp="1591182426442" />
<screen x="0" y="0" width="1440" height="900" /> <state width="914" height="268" key="GridCell.Tab.0.center" timestamp="1591182426442">
<screen x="0" y="0" width="1920" height="1040" />
</state> </state>
<state width="1398" height="245" key="GridCell.Tab.0.center/0.0.1440.900@0.0.1440.900" timestamp="1591173185825" /> <state width="1398" height="245" key="GridCell.Tab.0.center/0.0.1440.900@0.0.1440.900" timestamp="1591173185825" />
<state width="1398" height="245" key="GridCell.Tab.0.left" timestamp="1591173185825"> <state width="914" height="268" key="GridCell.Tab.0.center/0.0.1920.1040@0.0.1920.1040" timestamp="1591182426442" />
<screen x="0" y="0" width="1440" height="900" /> <state width="914" height="268" key="GridCell.Tab.0.left" timestamp="1591182426442">
<screen x="0" y="0" width="1920" height="1040" />
</state> </state>
<state width="1398" height="245" key="GridCell.Tab.0.left/0.0.1440.900@0.0.1440.900" timestamp="1591173185825" /> <state width="1398" height="245" key="GridCell.Tab.0.left/0.0.1440.900@0.0.1440.900" timestamp="1591173185825" />
<state width="1398" height="245" key="GridCell.Tab.0.right" timestamp="1591173185826"> <state width="914" height="268" key="GridCell.Tab.0.left/0.0.1920.1040@0.0.1920.1040" timestamp="1591182426442" />
<screen x="0" y="0" width="1440" height="900" /> <state width="914" height="268" key="GridCell.Tab.0.right" timestamp="1591182426442">
<screen x="0" y="0" width="1920" height="1040" />
</state> </state>
<state width="1398" height="245" key="GridCell.Tab.0.right/0.0.1440.900@0.0.1440.900" timestamp="1591173185826" /> <state width="1398" height="245" key="GridCell.Tab.0.right/0.0.1440.900@0.0.1440.900" timestamp="1591173185826" />
<state width="914" height="268" key="GridCell.Tab.0.right/0.0.1920.1040@0.0.1920.1040" timestamp="1591182426442" />
<state x="335" y="156" width="915" height="587" key="NewModule_or_Project.wizard" timestamp="1591172753823"> <state x="335" y="156" width="915" height="587" key="NewModule_or_Project.wizard" timestamp="1591172753823">
<screen x="0" y="0" width="1440" height="900" /> <screen x="0" y="0" width="1440" height="900" />
</state> </state>

View File

@@ -1,6 +1,63 @@
T__8=8 T__23=23
FLOATCONST=4 T__24=24
ID=5 T__25=25
INTCONST=6 T__26=26
WS=7 T__27=27
'TODO'=8 T__28=28
T__29=29
T__30=30
T__31=31
T__32=32
T__33=33
T__34=34
T__35=35
T__36=36
T__37=37
T__38=38
T__39=39
T__40=40
T__41=41
T__42=42
BINOP=4
DECL=5
DECLIST=6
ESCAPE=7
EXPR=8
FLOATCONST=9
ID=10
INTCONST=11
MODIFIER=12
PROGRAM=13
STAT=14
STATLIST=15
STRINGCONST=16
TYPE=17
UDIVIDE=18
UMINUS=19
UMULTIPLY=20
UPLUS=21
WS=22
'('=23
')'=24
'*'=20
'+'=21
'-'=19
'.'=25
'/'=18
':'=26
':='=27
';'=28
'begin'=29
'else'=30
'end'=31
'float'=32
'for'=33
'if'=34
'int'=35
'print'=36
'program'=37
'read print'=38
'read'=39
'string'=40
'then'=41
'while'=42

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -24,6 +24,18 @@ tokens {
INTCONST; INTCONST;
FLOATCONST; FLOATCONST;
WS; WS;
MODIFIER;
UMINUS='-';
UPLUS='+';
UMULTIPLY='*';
UDIVIDE='/';
DECLIST;
PROGRAM;
DECL;
TYPE;
STAT;
STATLIST;
EXPR;
} }
@parser::header {package de.dhbw.compiler.antlrxparser;} @parser::header {package de.dhbw.compiler.antlrxparser;}
@@ -35,10 +47,51 @@ ID: ('a'..'z' | 'A'..'Z')
(options { (options {
greedy = true; // Lese alle möglichen Zeichen ein -> Zahlen in ID -> bleibt weiterhin ID greedy = true; // Lese alle möglichen Zeichen ein -> Zahlen in ID -> bleibt weiterhin ID
}: 'a'..'z' | 'A'..'Z' | '0'..'9')*; }: 'a'..'z' | 'A'..'Z' | '0'..'9')*;
INTCONST: ('0'..'9')+;
FLOATCONST: INTCONST '.' INTCONST; INTCONST: ('0'..'9')+;
FLOATCONST: INTCONST '.' INTCONST;
STRINGCONST: '"' (ESCAPE | ~('\\' | '"'))* '"';
ESCAPE: '\\' ('\"' |'\'' | '\\');
BINOP: '+' | '-' | '*' | '/' | '<' | '>' | '=';
WS: ('\t' | ' ' | '\r' | '\n' | '\f')+ { skip(); }; WS: ('\t' | ' ' | '\r' | '\n' | '\f')+ { skip(); };
// Parser stuff
program: 'TODO'; // -- Parser stuff
program: 'program' ID ';' decllist statlist '.' EOF -> ^(PROGRAM ID decllist statlist);
// Declaration
decllist: decl decllist -> ^(DECLIST decl decllist);
decl: modifier ID ':' type ';' -> ^(DECL modifier ID type);
modifier: mod='read' | mod='print' | mod='read print' -> ^(MODIFIER[mod]);
type: t='int' | t='float' | t='string' -> ^(TYPE[t]);
// Block
statlist: 'begin' (stat ';')* 'end' -> ^(STATLIST stat*);
stat: t=assignstat | t=condstat | t=whilestat | t=forstat -> ^(STAT[t])
| statlist
-> ^(STATLIST statlist);
assignstat: ID ':=' expr -> ^(':=' ID expr);
condstat: 'if' cond 'then' stat condElseStat? -> ^('if' cond stat condElseStat? );
condElseStat: 'else' stat -> ^('else' stat);
whilestat: 'while' '(' cond ')' stat -> ^('while' cond stat);
forstat: 'for' '(' assignstat ';' cond ';' assignstat ')' stat
-> ^('for' assignstat cond assignstat stat);
expr: expr2 UPLUS expr -> ^(UPLUS expr2 expr)
| expr2 UMINUS expr -> ^(UMINUS expr2 expr)
| expr2 -> ^(expr2);
expr2: expr3 UMULTIPLY expr2 -> ^(UMULTIPLY expr3 expr2)
| expr3 UDIVIDE expr2 -> ^(UDIVIDE expr3 expr2)
| expr3 -> ^(expr3);
expr3: number -> ^(number)
| UMINUS number -> ^(UMINUS number)
| t=STRINGCONST | t=ID -> ^($t)
| '(' expr ')' -> ^(expr);
number: INTCONST | FLOATCONST;
cond: expr cond2 -> ^(expr cond2);
cond2: BINOP expr -> ^(BINOP expr);

View File

@@ -24,6 +24,18 @@ tokens {
INTCONST; INTCONST;
FLOATCONST; FLOATCONST;
WS; WS;
MODIFIER;
UMINUS='-';
UPLUS='+';
UMULTIPLY='*';
UDIVIDE='/';
DECLIST;
PROGRAM;
DECL;
TYPE;
STAT;
STATLIST;
EXPR;
} }
@parser::header {package de.dhbw.compiler.antlrxparser;} @parser::header {package de.dhbw.compiler.antlrxparser;}
@@ -35,10 +47,51 @@ ID: ('a'..'z' | 'A'..'Z')
(options { (options {
greedy = true; // Lese alle möglichen Zeichen ein -> Zahlen in ID -> bleibt weiterhin ID greedy = true; // Lese alle möglichen Zeichen ein -> Zahlen in ID -> bleibt weiterhin ID
}: 'a'..'z' | 'A'..'Z' | '0'..'9')*; }: 'a'..'z' | 'A'..'Z' | '0'..'9')*;
INTCONST: ('0'..'9')+;
FLOATCONST: INTCONST '.' INTCONST; INTCONST: ('0'..'9')+;
FLOATCONST: INTCONST '.' INTCONST;
STRINGCONST: '"' (ESCAPE | ~('\\' | '"'))* '"';
ESCAPE: '\\' ('\"' |'\'' | '\\');
BINOP: '+' | '-' | '*' | '/' | '<' | '>' | '=';
WS: ('\t' | ' ' | '\r' | '\n' | '\f')+ { skip(); }; WS: ('\t' | ' ' | '\r' | '\n' | '\f')+ { skip(); };
// Parser stuff
program: 'TODO'; // -- Parser stuff
program: 'program' ID ';' decllist statlist '.' EOF -> ^(PROGRAM ID decllist statlist);
// Declaration
decllist: decl decllist -> ^(DECLIST decl decllist);
decl: modifier ID ':' type ';' -> ^(DECL modifier ID type);
modifier: mod='read' | mod='print' | mod='read print' -> ^(MODIFIER[mod]);
type: t='int' | t='float' | t='string' -> ^(TYPE[t]);
// Block
statlist: 'begin' (stat ';')* 'end' -> ^(STATLIST stat*);
stat: t=assignstat | t=condstat | t=whilestat | t=forstat -> ^(STAT[t])
| statlist
-> ^(STATLIST statlist);
assignstat: ID ':=' expr -> ^(':=' ID expr);
condstat: 'if' cond 'then' stat condElseStat? -> ^('if' cond stat condElseStat? );
condElseStat: 'else' stat -> ^('else' stat);
whilestat: 'while' '(' cond ')' stat -> ^('while' cond stat);
forstat: 'for' '(' assignstat ';' cond ';' assignstat ')' stat
-> ^('for' assignstat cond assignstat stat);
expr: expr2 UPLUS expr -> ^(UPLUS expr2 expr)
| expr2 UMINUS expr -> ^(UMINUS expr2 expr)
| expr2 -> ^(expr2);
expr2: expr3 UMULTIPLY expr2 -> ^(UMULTIPLY expr3 expr2)
| expr3 UDIVIDE expr2 -> ^(UDIVIDE expr3 expr2)
| expr3 -> ^(expr3);
expr3: number -> ^(number)
| UMINUS number -> ^(UMINUS number)
| t=STRINGCONST | t=ID -> ^($t)
| '(' expr ')' -> ^(expr);
number: INTCONST | FLOATCONST;
cond: expr cond2 -> ^(expr cond2);
cond2: BINOP expr -> ^(BINOP expr);