antlr grammar and AST for il65

This commit is contained in:
Irmen de Jong 2018-08-10 02:58:41 +02:00
parent 7e511a1fe9
commit 1ccc73f1f8
6 changed files with 203 additions and 147 deletions

View File

@ -31,22 +31,22 @@ module : statement* EOF ;
statement :
directive
| varinitializer
| vardecl
| constdecl
| memoryvardecl
| vardecl
| varinitializer
| assignment
| augassignment
;
directive : '%' singlename (directivearg? | directivearg (',' directivearg)*) ;
directive : '%' identifier (directivearg? | directivearg (',' directivearg)*) ;
directivearg : singlename | integerliteral ;
directivearg : identifier | integerliteral ;
vardecl: datatype arrayspec? singlename ;
vardecl: datatype arrayspec? identifier ;
varinitializer : datatype arrayspec? singlename '=' expression ;
varinitializer : datatype arrayspec? identifier '=' expression ;
constdecl: 'const' varinitializer ;
@ -59,40 +59,40 @@ arrayspec: '[' expression (',' expression)? ']' ;
assignment : assign_target '=' expression ;
augassignment :
assign_target ('+=' | '-=' | '/=' | '//=' | '*=' | '**=' |
assign_target operator=('+=' | '-=' | '/=' | '//=' | '*=' | '**=' |
'<<=' | '>>=' | '<<@=' | '>>@=' | '&=' | '|=' | '^=') expression
;
assign_target:
register
| singlename
| dottedname
| identifier
| scoped_identifier
;
expression :
unary_expression
| '(' expression ')'
| expression '**' expression
| expression ('*' | '/' | '//' | '**') expression
| expression ('+' | '-' | '%') expression
| expression ('<<' | '>>' | '<<@' | '>>@' | '&' | '|' | '^') expression
| expression ('and' | 'or' | 'xor') expression
| expression ('==' | '!=' | '<' | '>' | '<=' | '>=') expression
unaryexp = unary_expression
| '(' precedence_expr=expression ')'
| left = expression '**' right = expression
| left = expression ('*' | '/' | '//' | '**') right = expression
| left = expression ('+' | '-' | '%') right = expression
| left = expression ('<<' | '>>' | '<<@' | '>>@' | '&' | '|' | '^') right = expression
| left = expression ('and' | 'or' | 'xor') right = expression
| left = expression ('==' | '!=' | '<' | '>' | '<=' | '>=') right = expression
| literalvalue
| register
| dottedname
| singlename
| identifier
| scoped_identifier
;
unary_expression :
'~' expression
| ('+' | '-') expression
| 'not' expression
operator = '~' expression
| operator = ('+' | '-') expression
| operator = 'not' expression
;
singlename : NAME ;
identifier : NAME ;
dottedname : NAME ('.' NAME)+ ;
scoped_identifier : NAME ('.' NAME)+ ;
register : 'A' | 'X' | 'Y' | 'AX' | 'AY' | 'XY' | 'SC' | 'SI' | 'SZ' ;

View File

@ -4,10 +4,24 @@
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="lib" level="project" />
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
<orderEntry type="module-library">
<library name="JUnit5.2">
<CLASSES>
<root url="jar://$MODULE_DIR$/../lib/junit-jupiter-api-5.3.0-M1.jar!/" />
<root url="jar://$MODULE_DIR$/../lib/apiguardian-api-1.0.0.jar!/" />
<root url="jar://$MODULE_DIR$/../lib/opentest4j-1.1.0.jar!/" />
<root url="jar://$MODULE_DIR$/../lib/junit-platform-commons-1.3.0-M1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="library" name="org.hamcrest:hamcrest-library:1.2.1" level="project" />
</component>
</module>

View File

@ -11,8 +11,11 @@ fun main(args: Array<String>) {
// println("Reading source file: ${args[0]}")
val input = CharStreams.fromString(
"AX //= (5+8)*77\n" +
"X = -3.44e-99")
"byte derp=3"
// +
// "AX //= (5+8)*77\n" +
// "X = -3.44e-99"
)
val lexer = il65Lexer(input)
val tokens = CommonTokenStream(lexer)
val parser = il65Parser(tokens)

View File

@ -61,7 +61,7 @@ data class MemoryVarDecl(override val datatype: DataType,
data class Assignment(val target: AssignTarget, val aug_op : String?, val value: IExpression) : IStatement
data class AssignTarget(val register: Register?, val singlename: String?, val dottedname: String?) : Node
data class AssignTarget(val register: Register?, val identifier: String?, val scoped_identifier: String?) : Node
interface IExpression: Node
@ -78,42 +78,45 @@ data class LiteralValue(val intvalue: Int?,
data class RegisterExpr(val register: Register) : IExpression
data class DottedNameExpr(val dottedname: String) : IExpression
data class SingleNameExpr(val name: String) : IExpression
data class Identifier(val name: String, val scope: String?) : IExpression
fun il65Parser.ModuleContext.toAst() = Module(this.statement().map { it.toAst() })
fun il65Parser.StatementContext.toAst() : IStatement {
val directive = this.directive()?.toAst()
if(directive!=null) return directive
val vardecl = this.vardecl()
if(vardecl!=null) {
return VarDecl(vardecl.datatype().toAst(),
vardecl.arrayspec()?.toAst(),
vardecl.singlename().text,
vardecl.identifier().text,
null)
}
val varinit = this.varinitializer()
if(varinit!=null) {
return VarDecl(varinit.datatype().toAst(),
varinit.arrayspec()?.toAst(),
varinit.identifier().text,
varinit.expression().toAst())
}
val constdecl = this.constdecl()
if(constdecl!=null) {
val varinit = constdecl.varinitializer()
return ConstDecl(varinit.datatype().toAst(),
varinit.arrayspec()?.toAst(),
varinit.singlename().text,
varinit.expression().toAst())
val cvarinit = constdecl.varinitializer()
return ConstDecl(cvarinit.datatype().toAst(),
cvarinit.arrayspec()?.toAst(),
cvarinit.identifier().text,
cvarinit.expression().toAst())
}
val memdecl = this.memoryvardecl()
if(memdecl!=null) {
val varinit = memdecl.varinitializer()
return MemoryVarDecl(varinit.datatype().toAst(),
varinit.arrayspec()?.toAst(),
varinit.singlename().text,
varinit.expression().toAst())
val mvarinit = memdecl.varinitializer()
return MemoryVarDecl(mvarinit.datatype().toAst(),
mvarinit.arrayspec()?.toAst(),
mvarinit.identifier().text,
mvarinit.expression().toAst())
}
val assign = this.assignment()
@ -122,22 +125,24 @@ fun il65Parser.StatementContext.toAst() : IStatement {
}
val augassign = this.augassignment()
if (augassign!=null) {
if (augassign!=null)
return Assignment(
augassign.assign_target().toAst(),
augassign.children[1].text,
augassign.expression().toAst())
}
augassign.assign_target().toAst(),
augassign.operator.text,
augassign.expression().toAst())
val directive = this.directive()?.toAst()
if(directive!=null) return directive
throw UnsupportedOperationException(this.text)
}
fun il65Parser.Assign_targetContext.toAst() =
AssignTarget(this.register()?.toAst(), this.singlename()?.text, this.dottedname()?.text)
AssignTarget(this.register()?.toAst(), this.identifier()?.text, this.scoped_identifier()?.text)
fun il65Parser.RegisterContext.toAst() = Register.valueOf(this.text)
fun il65Parser.RegisterContext.toAst() = Register.valueOf(this.text.toUpperCase())
fun il65Parser.DatatypeContext.toAst() = DataType.valueOf(this.text)
fun il65Parser.DatatypeContext.toAst() = DataType.valueOf(this.text.toUpperCase())
fun il65Parser.ArrayspecContext.toAst() = ArraySpec(
this.expression(0).toAst(),
@ -145,9 +150,9 @@ fun il65Parser.ArrayspecContext.toAst() = ArraySpec(
)
fun il65Parser.DirectiveContext.toAst() = Directive(this.singlename().text, this.directivearg().map { it.toAst() })
fun il65Parser.DirectiveContext.toAst() = Directive(this.identifier().text, this.directivearg().map { it.toAst() })
fun il65Parser.DirectiveargContext.toAst() = DirectiveArg(this.singlename()?.text, this.integerliteral()?.toAst())
fun il65Parser.DirectiveargContext.toAst() = DirectiveArg(this.identifier()?.text, this.integerliteral()?.toAst())
fun il65Parser.IntegerliteralContext.toAst(): Int {
val terminal: TerminalNode = this.children[0] as TerminalNode
@ -161,40 +166,33 @@ fun il65Parser.IntegerliteralContext.toAst(): Int {
fun il65Parser.ExpressionContext.toAst() : IExpression {
if(this.singlename()!=null) {
return SingleNameExpr(this.singlename().text)
}
if(this.identifier()!=null)
return Identifier(this.identifier().text, null)
val litval = this.literalvalue()
if(litval!=null) {
if(litval!=null)
return LiteralValue(litval.integerliteral()?.toAst(),
litval.floatliteral()?.toAst(),
litval.stringliteral()?.text,
litval.booleanliteral()?.toAst(),
litval.arrayliteral()?.toAst()
)
}
litval.floatliteral()?.toAst(),
litval.stringliteral()?.text,
litval.booleanliteral()?.toAst(),
litval.arrayliteral()?.toAst()
)
if(this.dottedname()!=null) {
return DottedNameExpr(this.dottedname().text)
}
if(this.scoped_identifier()!=null)
return Identifier(this.scoped_identifier().text, "SCOPE????") // todo!
if(this.register()!=null) {
if(this.register()!=null)
return RegisterExpr(this.register().toAst())
}
if(this.unary_expression()!=null) {
return UnaryExpression(this.unary_expression().children[0].text, this.unary_expression().expression().toAst())
}
if(this.unaryexp!=null)
return UnaryExpression(this.unaryexp.operator.text, this.unaryexp.expression().toAst())
if(this.expression().size == 2) {
return BinaryExpression(this.expression(0).toAst(), this.text, this.expression(1).toAst())
}
if(this.left != null && this.right != null)
return BinaryExpression(this.left.toAst(), this.text, this.right.toAst())
// (....)
if(this.childCount == 3 && this.children[0].text=="(" && this.children[2].text==")") {
return this.expression(0).toAst()
}
// ( expression )
if(this.precedence_expr!=null)
return this.precedence_expr.toAst()
throw UnsupportedOperationException(this.text)
}

View File

@ -33,13 +33,13 @@ public class il65Parser extends Parser {
RULE_vardecl = 4, RULE_varinitializer = 5, RULE_constdecl = 6, RULE_memoryvardecl = 7,
RULE_datatype = 8, RULE_arrayspec = 9, RULE_assignment = 10, RULE_augassignment = 11,
RULE_assign_target = 12, RULE_expression = 13, RULE_unary_expression = 14,
RULE_singlename = 15, RULE_dottedname = 16, RULE_register = 17, RULE_integerliteral = 18,
RULE_booleanliteral = 19, RULE_arrayliteral = 20, RULE_stringliteral = 21,
RULE_floatliteral = 22, RULE_literalvalue = 23;
RULE_identifier = 15, RULE_scoped_identifier = 16, RULE_register = 17,
RULE_integerliteral = 18, RULE_booleanliteral = 19, RULE_arrayliteral = 20,
RULE_stringliteral = 21, RULE_floatliteral = 22, RULE_literalvalue = 23;
public static final String[] ruleNames = {
"module", "statement", "directive", "directivearg", "vardecl", "varinitializer",
"constdecl", "memoryvardecl", "datatype", "arrayspec", "assignment", "augassignment",
"assign_target", "expression", "unary_expression", "singlename", "dottedname",
"assign_target", "expression", "unary_expression", "identifier", "scoped_identifier",
"register", "integerliteral", "booleanliteral", "arrayliteral", "stringliteral",
"floatliteral", "literalvalue"
};
@ -166,18 +166,18 @@ public class il65Parser extends Parser {
public DirectiveContext directive() {
return getRuleContext(DirectiveContext.class,0);
}
public ConstdeclContext constdecl() {
return getRuleContext(ConstdeclContext.class,0);
}
public MemoryvardeclContext memoryvardecl() {
return getRuleContext(MemoryvardeclContext.class,0);
}
public VardeclContext vardecl() {
return getRuleContext(VardeclContext.class,0);
}
public VarinitializerContext varinitializer() {
return getRuleContext(VarinitializerContext.class,0);
}
public ConstdeclContext constdecl() {
return getRuleContext(ConstdeclContext.class,0);
}
public MemoryvardeclContext memoryvardecl() {
return getRuleContext(MemoryvardeclContext.class,0);
}
public AssignmentContext assignment() {
return getRuleContext(AssignmentContext.class,0);
}
@ -208,28 +208,28 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 2);
{
setState(57);
constdecl();
vardecl();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
setState(58);
memoryvardecl();
varinitializer();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
setState(59);
vardecl();
constdecl();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
setState(60);
varinitializer();
memoryvardecl();
}
break;
case 6:
@ -260,8 +260,8 @@ public class il65Parser extends Parser {
}
public static class DirectiveContext extends ParserRuleContext {
public SinglenameContext singlename() {
return getRuleContext(SinglenameContext.class,0);
public IdentifierContext identifier() {
return getRuleContext(IdentifierContext.class,0);
}
public List<DirectiveargContext> directivearg() {
return getRuleContexts(DirectiveargContext.class);
@ -285,7 +285,7 @@ public class il65Parser extends Parser {
setState(65);
match(T__0);
setState(66);
singlename();
identifier();
setState(78);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) {
@ -340,8 +340,8 @@ public class il65Parser extends Parser {
}
public static class DirectiveargContext extends ParserRuleContext {
public SinglenameContext singlename() {
return getRuleContext(SinglenameContext.class,0);
public IdentifierContext identifier() {
return getRuleContext(IdentifierContext.class,0);
}
public IntegerliteralContext integerliteral() {
return getRuleContext(IntegerliteralContext.class,0);
@ -363,7 +363,7 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1);
{
setState(80);
singlename();
identifier();
}
break;
case DEC_INTEGER:
@ -394,8 +394,8 @@ public class il65Parser extends Parser {
public DatatypeContext datatype() {
return getRuleContext(DatatypeContext.class,0);
}
public SinglenameContext singlename() {
return getRuleContext(SinglenameContext.class,0);
public IdentifierContext identifier() {
return getRuleContext(IdentifierContext.class,0);
}
public ArrayspecContext arrayspec() {
return getRuleContext(ArrayspecContext.class,0);
@ -426,7 +426,7 @@ public class il65Parser extends Parser {
}
setState(88);
singlename();
identifier();
}
}
catch (RecognitionException re) {
@ -444,8 +444,8 @@ public class il65Parser extends Parser {
public DatatypeContext datatype() {
return getRuleContext(DatatypeContext.class,0);
}
public SinglenameContext singlename() {
return getRuleContext(SinglenameContext.class,0);
public IdentifierContext identifier() {
return getRuleContext(IdentifierContext.class,0);
}
public ExpressionContext expression() {
return getRuleContext(ExpressionContext.class,0);
@ -479,7 +479,7 @@ public class il65Parser extends Parser {
}
setState(94);
singlename();
identifier();
setState(95);
match(T__2);
setState(96);
@ -690,6 +690,7 @@ public class il65Parser extends Parser {
}
public static class AugassignmentContext extends ParserRuleContext {
public Token operator;
public Assign_targetContext assign_target() {
return getRuleContext(Assign_targetContext.class,0);
}
@ -712,9 +713,10 @@ public class il65Parser extends Parser {
setState(118);
assign_target();
setState(119);
((AugassignmentContext)_localctx).operator = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26))) != 0)) ) {
_errHandler.recoverInline(this);
((AugassignmentContext)_localctx).operator = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
@ -740,11 +742,11 @@ public class il65Parser extends Parser {
public RegisterContext register() {
return getRuleContext(RegisterContext.class,0);
}
public SinglenameContext singlename() {
return getRuleContext(SinglenameContext.class,0);
public IdentifierContext identifier() {
return getRuleContext(IdentifierContext.class,0);
}
public DottednameContext dottedname() {
return getRuleContext(DottednameContext.class,0);
public Scoped_identifierContext scoped_identifier() {
return getRuleContext(Scoped_identifierContext.class,0);
}
public Assign_targetContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
@ -770,14 +772,14 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 2);
{
setState(123);
singlename();
identifier();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
setState(124);
dottedname();
scoped_identifier();
}
break;
}
@ -794,6 +796,10 @@ public class il65Parser extends Parser {
}
public static class ExpressionContext extends ParserRuleContext {
public ExpressionContext left;
public Unary_expressionContext unaryexp;
public ExpressionContext precedence_expr;
public ExpressionContext right;
public Unary_expressionContext unary_expression() {
return getRuleContext(Unary_expressionContext.class,0);
}
@ -809,11 +815,11 @@ public class il65Parser extends Parser {
public RegisterContext register() {
return getRuleContext(RegisterContext.class,0);
}
public DottednameContext dottedname() {
return getRuleContext(DottednameContext.class,0);
public IdentifierContext identifier() {
return getRuleContext(IdentifierContext.class,0);
}
public SinglenameContext singlename() {
return getRuleContext(SinglenameContext.class,0);
public Scoped_identifierContext scoped_identifier() {
return getRuleContext(Scoped_identifierContext.class,0);
}
public ExpressionContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
@ -843,7 +849,7 @@ public class il65Parser extends Parser {
case 1:
{
setState(128);
unary_expression();
((ExpressionContext)_localctx).unaryexp = unary_expression();
}
break;
case 2:
@ -851,7 +857,7 @@ public class il65Parser extends Parser {
setState(129);
match(T__27);
setState(130);
expression(0);
((ExpressionContext)_localctx).precedence_expr = expression(0);
setState(131);
match(T__28);
}
@ -871,13 +877,13 @@ public class il65Parser extends Parser {
case 5:
{
setState(135);
dottedname();
identifier();
}
break;
case 6:
{
setState(136);
singlename();
scoped_identifier();
}
break;
}
@ -896,18 +902,22 @@ public class il65Parser extends Parser {
case 1:
{
_localctx = new ExpressionContext(_parentctx, _parentState);
_localctx.left = _prevctx;
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(139);
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
setState(140);
match(T__29);
setState(141);
expression(11);
((ExpressionContext)_localctx).right = expression(11);
}
break;
case 2:
{
_localctx = new ExpressionContext(_parentctx, _parentState);
_localctx.left = _prevctx;
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(142);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
@ -922,12 +932,14 @@ public class il65Parser extends Parser {
consume();
}
setState(144);
expression(10);
((ExpressionContext)_localctx).right = expression(10);
}
break;
case 3:
{
_localctx = new ExpressionContext(_parentctx, _parentState);
_localctx.left = _prevctx;
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(145);
if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
@ -942,12 +954,14 @@ public class il65Parser extends Parser {
consume();
}
setState(147);
expression(9);
((ExpressionContext)_localctx).right = expression(9);
}
break;
case 4:
{
_localctx = new ExpressionContext(_parentctx, _parentState);
_localctx.left = _prevctx;
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(148);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
@ -962,12 +976,14 @@ public class il65Parser extends Parser {
consume();
}
setState(150);
expression(8);
((ExpressionContext)_localctx).right = expression(8);
}
break;
case 5:
{
_localctx = new ExpressionContext(_parentctx, _parentState);
_localctx.left = _prevctx;
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(151);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
@ -982,12 +998,14 @@ public class il65Parser extends Parser {
consume();
}
setState(153);
expression(7);
((ExpressionContext)_localctx).right = expression(7);
}
break;
case 6:
{
_localctx = new ExpressionContext(_parentctx, _parentState);
_localctx.left = _prevctx;
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(154);
if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
@ -1002,7 +1020,7 @@ public class il65Parser extends Parser {
consume();
}
setState(156);
expression(6);
((ExpressionContext)_localctx).right = expression(6);
}
break;
}
@ -1026,6 +1044,7 @@ public class il65Parser extends Parser {
}
public static class Unary_expressionContext extends ParserRuleContext {
public Token operator;
public ExpressionContext expression() {
return getRuleContext(ExpressionContext.class,0);
}
@ -1047,7 +1066,7 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1);
{
setState(162);
match(T__51);
((Unary_expressionContext)_localctx).operator = match(T__51);
setState(163);
expression(0);
}
@ -1057,9 +1076,10 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 2);
{
setState(164);
((Unary_expressionContext)_localctx).operator = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__33 || _la==T__34) ) {
_errHandler.recoverInline(this);
((Unary_expressionContext)_localctx).operator = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
@ -1074,7 +1094,7 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 3);
{
setState(166);
match(T__52);
((Unary_expressionContext)_localctx).operator = match(T__52);
setState(167);
expression(0);
}
@ -1094,17 +1114,17 @@ public class il65Parser extends Parser {
return _localctx;
}
public static class SinglenameContext extends ParserRuleContext {
public static class IdentifierContext extends ParserRuleContext {
public TerminalNode NAME() { return getToken(il65Parser.NAME, 0); }
public SinglenameContext(ParserRuleContext parent, int invokingState) {
public IdentifierContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@Override public int getRuleIndex() { return RULE_singlename; }
@Override public int getRuleIndex() { return RULE_identifier; }
}
public final SinglenameContext singlename() throws RecognitionException {
SinglenameContext _localctx = new SinglenameContext(_ctx, getState());
enterRule(_localctx, 30, RULE_singlename);
public final IdentifierContext identifier() throws RecognitionException {
IdentifierContext _localctx = new IdentifierContext(_ctx, getState());
enterRule(_localctx, 30, RULE_identifier);
try {
enterOuterAlt(_localctx, 1);
{
@ -1123,20 +1143,20 @@ public class il65Parser extends Parser {
return _localctx;
}
public static class DottednameContext extends ParserRuleContext {
public static class Scoped_identifierContext extends ParserRuleContext {
public List<TerminalNode> NAME() { return getTokens(il65Parser.NAME); }
public TerminalNode NAME(int i) {
return getToken(il65Parser.NAME, i);
}
public DottednameContext(ParserRuleContext parent, int invokingState) {
public Scoped_identifierContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@Override public int getRuleIndex() { return RULE_dottedname; }
@Override public int getRuleIndex() { return RULE_scoped_identifier; }
}
public final DottednameContext dottedname() throws RecognitionException {
DottednameContext _localctx = new DottednameContext(_ctx, getState());
enterRule(_localctx, 32, RULE_dottedname);
public final Scoped_identifierContext scoped_identifier() throws RecognitionException {
Scoped_identifierContext _localctx = new Scoped_identifierContext(_ctx, getState());
enterRule(_localctx, 32, RULE_scoped_identifier);
try {
int _alt;
enterOuterAlt(_localctx, 1);
@ -1537,11 +1557,11 @@ public class il65Parser extends Parser {
"\3\2\2\2$\u00b5\3\2\2\2&\u00b7\3\2\2\2(\u00b9\3\2\2\2*\u00bb\3\2\2\2,"+
"\u00c6\3\2\2\2.\u00c8\3\2\2\2\60\u00cf\3\2\2\2\62\64\5\4\3\2\63\62\3\2"+
"\2\2\64\67\3\2\2\2\65\63\3\2\2\2\65\66\3\2\2\2\668\3\2\2\2\67\65\3\2\2"+
"\289\7\2\2\39\3\3\2\2\2:B\5\6\4\2;B\5\16\b\2<B\5\20\t\2=B\5\n\6\2>B\5"+
"\f\7\2?B\5\26\f\2@B\5\30\r\2A:\3\2\2\2A;\3\2\2\2A<\3\2\2\2A=\3\2\2\2A"+
">\3\2\2\2A?\3\2\2\2A@\3\2\2\2B\5\3\2\2\2CD\7\3\2\2DP\5 \21\2EG\5\b\5\2"+
"FE\3\2\2\2FG\3\2\2\2GQ\3\2\2\2HM\5\b\5\2IJ\7\4\2\2JL\5\b\5\2KI\3\2\2\2"+
"LO\3\2\2\2MK\3\2\2\2MN\3\2\2\2NQ\3\2\2\2OM\3\2\2\2PF\3\2\2\2PH\3\2\2\2"+
"\289\7\2\2\39\3\3\2\2\2:B\5\6\4\2;B\5\n\6\2<B\5\f\7\2=B\5\16\b\2>B\5\20"+
"\t\2?B\5\26\f\2@B\5\30\r\2A:\3\2\2\2A;\3\2\2\2A<\3\2\2\2A=\3\2\2\2A>\3"+
"\2\2\2A?\3\2\2\2A@\3\2\2\2B\5\3\2\2\2CD\7\3\2\2DP\5 \21\2EG\5\b\5\2FE"+
"\3\2\2\2FG\3\2\2\2GQ\3\2\2\2HM\5\b\5\2IJ\7\4\2\2JL\5\b\5\2KI\3\2\2\2L"+
"O\3\2\2\2MK\3\2\2\2MN\3\2\2\2NQ\3\2\2\2OM\3\2\2\2PF\3\2\2\2PH\3\2\2\2"+
"Q\7\3\2\2\2RU\5 \21\2SU\5&\24\2TR\3\2\2\2TS\3\2\2\2U\t\3\2\2\2VX\5\22"+
"\n\2WY\5\24\13\2XW\3\2\2\2XY\3\2\2\2YZ\3\2\2\2Z[\5 \21\2[\13\3\2\2\2\\"+
"^\5\22\n\2]_\5\24\13\2^]\3\2\2\2^_\3\2\2\2_`\3\2\2\2`a\5 \21\2ab\7\5\2"+
@ -1553,7 +1573,7 @@ public class il65Parser extends Parser {
"\177|\3\2\2\2\177}\3\2\2\2\177~\3\2\2\2\u0080\33\3\2\2\2\u0081\u0082\b"+
"\17\1\2\u0082\u008c\5\36\20\2\u0083\u0084\7\36\2\2\u0084\u0085\5\34\17"+
"\2\u0085\u0086\7\37\2\2\u0086\u008c\3\2\2\2\u0087\u008c\5\60\31\2\u0088"+
"\u008c\5$\23\2\u0089\u008c\5\"\22\2\u008a\u008c\5 \21\2\u008b\u0081\3"+
"\u008c\5$\23\2\u0089\u008c\5 \21\2\u008a\u008c\5\"\22\2\u008b\u0081\3"+
"\2\2\2\u008b\u0083\3\2\2\2\u008b\u0087\3\2\2\2\u008b\u0088\3\2\2\2\u008b"+
"\u0089\3\2\2\2\u008b\u008a\3\2\2\2\u008c\u00a1\3\2\2\2\u008d\u008e\f\f"+
"\2\2\u008e\u008f\7 \2\2\u008f\u00a0\5\34\17\r\u0090\u0091\f\13\2\2\u0091"+

21
il65/test/UnitTests.kt Normal file
View File

@ -0,0 +1,21 @@
package demo
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.equalTo
import org.hamcrest.CoreMatchers.`is` as Is
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class TestSource() {
@Test
fun f() {
assertThat(2, Is(equalTo(2)))
}
@Test
fun f2() {
assertThat(2, Is(equalTo(3)))
}
}