Skip to content

Commit

Permalink
Feature(-): Finished the AST building during parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
Mellywins committed Mar 29, 2022
1 parent ef8589a commit 2268f67
Show file tree
Hide file tree
Showing 6 changed files with 1,494 additions and 869 deletions.
2 changes: 1 addition & 1 deletion ast.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func (n *Node) String() string {
if len(parts) > 1 {
return fmt.Sprintf("%v", strings.Join(parts, " "))
}
return strings.Join(parts, " ")
return strings.Join(parts, "")
//p := printer{}
//return p.Print(*n)
}
Expand Down
2 changes: 1 addition & 1 deletion lexer.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func (g *golex) Lex(lval *yySymType) (tokenType int) {
// you call into the parser.
func (l *golex) Error(message string) {
// is there a better way to handle this in the context of goyacc?
panic(fmt.Errorf(message))
panic(fmt.Errorf(fmt.Sprintf("error occured at (%d) with message %s", l.Scanner.TC, message)))
}
func newLexer() *lexmachine.Lexer {
return lexical.NewLexer()
Expand Down
210 changes: 199 additions & 11 deletions syntax.y
Original file line number Diff line number Diff line change
Expand Up @@ -97,16 +97,22 @@ MainClass : CLASS IDENTIFIER LEFTANGLEBRACKET PUBLIC STATIC VOID MAIN LEFTPARENT
;
ClassDeclaration : CLASS IDENTIFIER Extension LEFTANGLEBRACKET VarDeclaration MethodDeclaration RIGHTANGLEBRACKET
{
$$.ast=NewNode("ClassDeclaration:", nil).
$$.ast= NewNode("<NewClassDeclaration>:", nil).
AddKid(NewNode("",$1.token)).
AddKid(NewNode("",$2.token)).
AddKid($3.ast).
AddKid(NewNode("{",$4.token)).
AddKid($5.ast).
AddKid($6.ast).
AddKid(NewNode("}",$7.token))

}
| ClassDeclaration ClassDeclaration
{
$$.ast=NewNode("<ExtraClassDeclarations>:", nil).
AddKid($1.ast).
AddKid($2.ast)
}
| ClassDeclaration CLASS IDENTIFIER Extension LEFTANGLEBRACKET VarDeclaration MethodDeclaration RIGHTANGLEBRACKET
;
Extension: EXTENDS IDENTIFIER
{
Expand All @@ -117,22 +123,23 @@ Extension: EXTENDS IDENTIFIER
}
| ;

VarDeclaration : Type IDENTIFIER SEMICOLON VarDeclaration
VarDeclaration : VarDeclaration VarDeclaration
{
$$.ast=NewNode("",nil).
AddKid($1.ast).
AddKid(NewNode("",$2.token)).
AddKid(NewNode("",$3.token)).
AddKid($4.ast)
$$.ast=NewNode("<Variable definitions>:",nil).
AddKid($1.ast).
AddKid($2.ast)
}

| Type IDENTIFIER SEMICOLON
{
$$.ast=NewNode("",nil).
AddKid($1.ast).
AddKid(NewNode("",$2.token)).
AddKid(NewNode("",$3.token))
}
| { $$.ast=nil }
;

Statement : LEFTANGLEBRACKET Statement RIGHTANGLEBRACKET
{
$$.ast=NewNode("bracketed statement",nil).
Expand All @@ -141,39 +148,220 @@ Statement : LEFTANGLEBRACKET Statement RIGHTANGLEBRACKET
AddKid(NewNode("}",$3.token))
}
| IF LEFTPARENTHESIS Expression RIGHTPARENTHESIS Statement ELSE Statement
{
$$.ast=NewNode("<If block>",nil).
AddKid(NewNode("",$1.token)).
AddKid(NewNode("(",$2.token)).
AddKid($3.ast).
AddKid(NewNode(")",$4.token)).
AddKid($5.ast).
AddKid(NewNode("",$6.token)).
AddKid($7.ast)
}
| WHILE LEFTPARENTHESIS Expression RIGHTPARENTHESIS Statement
{
$$.ast=NewNode("<While block>",nil).
AddKid(NewNode("",$1.token)).
AddKid(NewNode("",$2.token)).
AddKid($3.ast).
AddKid(NewNode(")",$4.token)).
AddKid($4.ast)

}
| SYSTEMOUTPRINTLN LEFTPARENTHESIS Expression RIGHTPARENTHESIS SEMICOLON
{
$$.ast=NewNode("<Print Statement>",nil).
AddKid(NewNode("",$1.token)).
AddKid(NewNode("",$2.token)).
AddKid($3.ast).
AddKid(NewNode(")",$4.token)).
AddKid(NewNode("",$5.token))
}
| IDENTIFIER EQUAL Expression SEMICOLON
{
$$.ast=NewNode("<Affectation>",nil).
AddKid(NewNode("",$1.token)).
AddKid(NewNode("=",$2.token)).
AddKid($3.ast).
AddKid(NewNode("",$4.token))
}
| IDENTIFIER LEFTBRACKET Expression RIGHTBRACKET EQUAL Expression SEMICOLON
{
$$.ast=NewNode("<Array Affectation>",nil).
AddKid(NewNode("",$1.token)).
AddKid(NewNode("[",$2.token)).
AddKid($3.ast).
AddKid(NewNode("]",$4.token)).
AddKid(NewNode("=",$5.token)).
AddKid($6.ast).
AddKid(NewNode("",$7.token))
}
| Statement Statement
{
$$.ast=NewNode("<BlockOfStatements>:",nil).
AddKid($1.ast).
AddKid($2.ast)
}
| {$$.ast=NewNode("empty statement content",nil) } ;
Type: INT LEFTBRACKET RIGHTBRACKET { $$.ast=NewNode("int[]",$1.token)}
| BOOLEAN {$$.ast=NewNode("",$1.token)}
| INT {$$.ast=NewNode("",$1.token)}
| IDENTIFIER {$$.ast=NewNode("",$1.token)} ;
MethodTypeDeclaration:
| Type IDENTIFIER
| Type IDENTIFIER COMMA MethodTypeDeclaration ;
{
$$.ast=NewNode("",nil).
AddKid($1.ast).
AddKid(NewNode("",$2.token))
}
| Type IDENTIFIER COMMA MethodTypeDeclaration
{
$$.ast = NewNode("<Method input type>:",nil).
AddKid($1.ast).
AddKid(NewNode("",$2.token)).
AddKid(NewNode("",$3.token)).
AddKid($4.ast)
}
;

MethodDeclaration : PUBLIC Type IDENTIFIER LEFTPARENTHESIS MethodTypeDeclaration RIGHTPARENTHESIS LEFTANGLEBRACKET VarDeclaration Statement RETURN Expression SEMICOLON RIGHTANGLEBRACKET
| PUBLIC Type IDENTIFIER LEFTPARENTHESIS MethodTypeDeclaration RIGHTPARENTHESIS LEFTANGLEBRACKET VarDeclaration Statement RETURN Expression SEMICOLON RIGHTANGLEBRACKET MethodDeclaration
| ;
{
$$.ast=NewNode("<MethodDeclaration>:",nil).
AddKid(NewNode("",$1.token)).
AddKid($2.ast).
AddKid(NewNode("",$3.token)).
AddKid(NewNode("(",$4.token)).
AddKid($5.ast).
AddKid(NewNode(")",$6.token)).
AddKid(NewNode("{",$7.token)).
AddKid($8.ast).
AddKid($9.ast).
AddKid(NewNode("",$10.token)).
AddKid($11.ast).
AddKid(NewNode(";",$12.token)).
AddKid(NewNode("}",$13.token))
}
| MethodDeclaration MethodDeclaration
{
$$.ast=NewNode("<MethodDeclarations>:",nil).
AddKid($1.ast).
AddKid($2.ast)

}
;

Expression : IDENTIFIER
{
$$.ast=NewNode("",$1.token)
}
| Expression LOGICALAND Expression
{
$$.ast=NewNode("&&",$2.token).
AddKid($1.ast).
AddKid($3.ast)
}
| Expression LESS Expression
{
$$.ast=NewNode("<",$2.token).
AddKid($1.ast).
AddKid($3.ast)
}
| Expression PLUS Expression
{
$$.ast=NewNode("+",$2.token).
AddKid($1.ast).
AddKid($3.ast)
}
| Expression MINUS Expression
{
$$.ast=NewNode("+",$2.token).
AddKid($1.ast).
AddKid($3.ast)
}
| Expression ASTERIX Expression
{
$$.ast=NewNode("*",$2.token).
AddKid($1.ast).
AddKid($3.ast)
}
| INTEGER_LITERAL
{
$$.ast=NewNode("",$1.token)
}
| BOOLEAN_LITERAL
{
$$.ast=NewNode("",$1.token)
}
| Expression LEFTBRACKET Expression RIGHTBRACKET
{
$$.ast=NewNode("",nil).
AddKid($1.ast).
AddKid(NewNode("[",$2.token)).
AddKid($3.ast).
AddKid(NewNode("]",$4.token))
}
| Expression PERIOD LENGTH
{
$$.ast=NewNode("<PeriodAccess>:",nil).
AddKid($1.ast).
AddKid(NewNode(".",$2.token)).
AddKid(NewNode("",$3.token))
}
| Expression PERIOD IDENTIFIER LEFTPARENTHESIS MethodExpressionSignature RIGHTPARENTHESIS
{
$$.ast=NewNode("<AccessedFunction>", nil).
AddKid($1.ast).
AddKid(NewNode(".",$2.token)).
AddKid(NewNode("",$3.token)).
AddKid(NewNode("(",$4.token)).
AddKid($5.ast).
AddKid(NewNode(")",$6.token))
}
| THIS
{
$$.ast=NewNode("",$1.token)
}
| NEW INT LEFTBRACKET Expression RIGHTBRACKET
{
$$.ast=NewNode("",nil).
AddKid(NewNode("",$1.token)).
AddKid(NewNode("",$2.token)).
AddKid(NewNode("[",$3.token)).
AddKid($4.ast).
AddKid(NewNode("]",$5.token))
}
| NEW IDENTIFIER LEFTPARENTHESIS RIGHTPARENTHESIS
{
$$.ast=NewNode("<Instantiation>:",nil).
AddKid(NewNode("",$1.token)).
AddKid(NewNode("",$2.token)).
AddKid(NewNode("(",$3.token)).
AddKid(NewNode(")",$4.token))
}
| BANG Expression
{
$$.ast=NewNode("<NOT!>:",nil).
AddKid(NewNode("!",$1.token)).
AddKid($2.ast)
}
| LEFTPARENTHESIS Expression RIGHTPARENTHESIS
{
$$.ast=NewNode("<ParenthesisedExpression>",nil).
AddKid(NewNode("(",$1.token)).
AddKid($2.ast).
AddKid(NewNode(")",$3.token))
}
;
MethodExpressionSignature : Expression
{
$$.ast=$1.ast
}
| MethodExpressionSignature COMMA Expression
{
$$.ast=NewNode("<MultiParametersMethodSignature>",nil).
AddKid($1.ast).
AddKid(NewNode(".",$2.token)).
AddKid($3.ast)
}
;
%%
17 changes: 14 additions & 3 deletions test/example.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,19 @@
class HelloWorld{
public static void main(String[] args){
{
if (1 && 2)
{
x=1;
while(1)

{
System.out.println(he);
}
}
else
{
System.out.println(Hello);
}
}
}
}
class Test extends Thread {
int id;
}
Loading

0 comments on commit 2268f67

Please sign in to comment.