Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Sven Gestegård Robertz
LabComm
Commits
b25d312c
Commit
b25d312c
authored
Mar 21, 2014
by
Sven Gestegård Robertz
Browse files
added type check for void types
parent
6e909d2c
Changes
9
Hide whitespace changes
Inline
Side-by-side
compiler/CS_CodeGen.jrag
View file @
b25d312c
...
@@ -645,6 +645,10 @@ aspect CS_Class {
...
@@ -645,6 +645,10 @@ aspect CS_Class {
" not declared");
" not declared");
}
}
public boolean VoidType.CS_needInstance() {
return false;
}
public boolean PrimType.CS_needInstance() {
public boolean PrimType.CS_needInstance() {
return false;
return false;
}
}
...
...
compiler/C_CodeGen.jrag
View file @
b25d312c
...
@@ -371,8 +371,10 @@ aspect C_Declarations {
...
@@ -371,8 +371,10 @@ aspect C_Declarations {
env.println("int labcomm"+env.verStr+"_encode_" + env.prefix + getName() + "(");
env.println("int labcomm"+env.verStr+"_encode_" + env.prefix + getName() + "(");
env.indent();
env.indent();
env.println("struct labcomm"+env.verStr+"_encoder *e,");
env.println("struct labcomm"+env.verStr+"_encoder *e");
env.println(env.prefix + getName() + " *v");
if(!isVoid() ) {
env.println(", "+env.prefix + getName() + " *v");
}
env.unindent();
env.unindent();
env.println(");");
env.println(");");
...
@@ -700,8 +702,10 @@ aspect C_Encoder {
...
@@ -700,8 +702,10 @@ aspect C_Encoder {
env = env.nestStruct("(*v)");
env = env.nestStruct("(*v)");
env.println("static int encode_" + env.prefix + getName() + "(");
env.println("static int encode_" + env.prefix + getName() + "(");
env.indent();
env.indent();
env.println("struct labcomm"+env.verStr+"_writer *w,");
env.println("struct labcomm"+env.verStr+"_writer *w");
env.println(env.prefix + getName() + " *v");
if(!isVoid() ) {
env.println(", "+env.prefix + getName() + " *v");
}
env.unindent();
env.unindent();
env.println(")");
env.println(")");
env.println("{");
env.println("{");
...
@@ -714,16 +718,19 @@ aspect C_Encoder {
...
@@ -714,16 +718,19 @@ aspect C_Encoder {
// Typesafe encode wrapper
// Typesafe encode wrapper
env.println("int labcomm"+env.verStr+"_encode_" + env.prefix + getName() + "(");
env.println("int labcomm"+env.verStr+"_encode_" + env.prefix + getName() + "(");
env.println("struct labcomm"+env.verStr+"_encoder *e,");
env.println("struct labcomm"+env.verStr+"_encoder *e");
env.println(env.prefix + getName() + " *v");
if(!isVoid() ) {
env.println(", "+env.prefix + getName() + " *v");
}
env.unindent();
env.unindent();
env.println(")");
env.println(")");
env.println("{");
env.println("{");
env.indent();
env.indent();
env.println("return labcomm"+env.verStr+"_internal_encode(e, &labcomm"+env.verStr+"_signature_" +
env.println("return labcomm"+env.verStr+"_internal_encode(e, &labcomm"+env.verStr+"_signature_" +
env.prefix + getName() +
env.prefix + getName() +
", (labcomm"+env.verStr+"_encoder_function)encode_" + env.prefix + getName() +
", (labcomm"+env.verStr+"_encoder_function)encode_" +
", v);");
env.prefix + getName() +
(!isVoid()?", v":", NULL")+");");
env.unindent();
env.unindent();
env.println("}");
env.println("}");
}
}
...
@@ -745,7 +752,7 @@ aspect C_Encoder {
...
@@ -745,7 +752,7 @@ aspect C_Encoder {
}
}
public void UserType.C_emitEncoder(C_env env) {
public void UserType.C_emitEncoder(C_env env) {
lookupType(getName()
).getType().C_emitEncoder(env);
decl(
).getType().C_emitEncoder(env);
}
}
public void StructType.C_emitEncoder(C_env env) {
public void StructType.C_emitEncoder(C_env env) {
...
...
compiler/ErrorCheck.jrag
View file @
b25d312c
...
@@ -20,6 +20,7 @@ aspect ErrorCheck {
...
@@ -20,6 +20,7 @@ aspect ErrorCheck {
}
}
public void ASTNode.errorCheck(Collection collection) {
public void ASTNode.errorCheck(Collection collection) {
nameCheck();
nameCheck();
typeCheck();
if(hasErrors())
if(hasErrors())
collection.add(errors);
collection.add(errors);
for(int i = 0; i < getNumChild(); i++) {
for(int i = 0; i < getNumChild(); i++) {
...
...
compiler/Java_CodeGen.jrag
View file @
b25d312c
...
@@ -196,6 +196,7 @@ aspect Java_StructName {
...
@@ -196,6 +196,7 @@ aspect Java_StructName {
aspect Java_Void {
aspect Java_Void {
syn boolean Decl.isVoid() = getType().isVoid();
syn boolean Decl.isVoid() = getType().isVoid();
syn boolean UserType.isVoid() = decl().isVoid();
syn boolean Type.isVoid() = false;
syn boolean Type.isVoid() = false;
syn boolean VoidType.isVoid() = true;
syn boolean VoidType.isVoid() = true;
...
@@ -746,6 +747,10 @@ aspect Java_Class {
...
@@ -746,6 +747,10 @@ aspect Java_Class {
" not declared");
" not declared");
}
}
public boolean VoidType.Java_needInstance() {
return false;
}
public boolean PrimType.Java_needInstance() {
public boolean PrimType.Java_needInstance() {
return false;
return false;
}
}
...
...
compiler/LabComm.ast
View file @
b25d312c
...
@@ -12,7 +12,7 @@ PrimType : Type ::= <Name:String> <Token:int>;
...
@@ -12,7 +12,7 @@ PrimType : Type ::= <Name:String> <Token:int>;
UserType : Type ::= <Name:String>;
UserType : Type ::= <Name:String>;
StructType : Type ::= Field*;
StructType : Type ::= Field*;
ParseArrayType : Type ::= Type Dim*;
ParseArrayType : Type ::= Type Dim*;
abstract ArrayType :
Type ::= Type Exp*;
abstract ArrayType :Type ::= Type Exp*;
VariableArrayType : ArrayType;
VariableArrayType : ArrayType;
FixedArrayType : ArrayType;
FixedArrayType : ArrayType;
...
...
compiler/LabCommParser.parser
View file @
b25d312c
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
s
.
append
(
" *** Syntactic error: unexpected token "
+
Terminals
.
NAMES
[
token
.
getId
()]);
s
.
append
(
" *** Syntactic error: unexpected token "
+
Terminals
.
NAMES
[
token
.
getId
()]);
throw
new
SourceError
(
s
.
toString
());
throw
new
SourceError
(
s
.
toString
());
//
super
.
syntaxError
(
token
);
//
super
.
syntaxError
(
token
);
//
throw
new
RuntimeException
(
token
.
getLine
(
token
.
getStart
())
+
", "
+
//
throw
new
RuntimeException
(
token
.
getLine
(
token
.
getStart
())
+
", "
+
//
token
.
getColumn
(
token
.
getStart
())
+
": Syntax Error"
);
//
token
.
getColumn
(
token
.
getStart
())
+
": Syntax Error"
);
}
}
public
void
scannerError
(
Scanner
.
Exception
e
)
{
public
void
scannerError
(
Scanner
.
Exception
e
)
{
...
@@ -55,51 +55,50 @@ List var_decl_list =
...
@@ -55,51 +55,50 @@ List var_decl_list =
Field
var_decl
=
Field
var_decl
=
type
.
t
IDENTIFIER
SEMICOLON
{:
return
new
Field
(
t
,
IDENTIFIER
);
:}
type
.
t
IDENTIFIER
SEMICOLON
{:
return
new
Field
(
t
,
IDENTIFIER
);
:}
|
type
.
t
IDENTIFIER
dim_list
.
d
SEMICOLON
|
type
.
t
IDENTIFIER
dim_list
.
d
SEMICOLON
{:
return
new
Field
(
new
ParseArrayType
(
t
,
d
),
IDENTIFIER
);
:}
{:
return
new
Field
(
new
ParseArrayType
(
t
,
d
),
IDENTIFIER
);
:}
;
;
TypeDecl
type_decl
=
TypeDecl
type_decl
=
TYPEDEF
type
.
t
IDENTIFIER
SEMICOLON
{:
return
new
TypeDecl
(
t
,
IDENTIFIER
);
:}
TYPEDEF
type
.
t
IDENTIFIER
SEMICOLON
{:
return
new
TypeDecl
(
t
,
IDENTIFIER
);
:}
|
TYPEDEF
type
.
t
IDENTIFIER
dim_list
.
d
SEMICOLON
|
TYPEDEF
type
.
t
IDENTIFIER
dim_list
.
d
SEMICOLON
{:
return
new
TypeDecl
(
new
ParseArrayType
(
t
,
d
),
IDENTIFIER
);
:}
{:
return
new
TypeDecl
(
new
ParseArrayType
(
t
,
d
),
IDENTIFIER
);
:}
;
;
SampleDecl
sample_decl
=
SampleDecl
sample_decl
=
SAMPLE
type
.
t
IDENTIFIER
SEMICOLON
SAMPLE
type
.
t
IDENTIFIER
SEMICOLON
{:
return
new
SampleDecl
(
t
,
IDENTIFIER
);
:}
{:
return
new
SampleDecl
(
t
,
IDENTIFIER
);
:}
|
SAMPLE
type
.
t
IDENTIFIER
dim_list
.
d
SEMICOLON
|
SAMPLE
type
.
t
IDENTIFIER
dim_list
.
d
SEMICOLON
{:
return
new
SampleDecl
(
new
ParseArrayType
(
t
,
d
),
IDENTIFIER
);
:}
{:
return
new
SampleDecl
(
new
ParseArrayType
(
t
,
d
),
IDENTIFIER
);
:}
|
SAMPLE
VOID
IDENTIFIER
SEMICOLON
{:
return
new
SampleDecl
(
new
VoidType
(),
IDENTIFIER
);
:}
;
;
Type
type
=
Type
type
=
prim_type
.
p
{:
return
p
;
:}
prim_type
.
p
{:
return
p
;
:}
|
user_type
.
u
{:
return
u
;
:}
|
user_type
.
u
{:
return
u
;
:}
|
struct_type
.
s
{:
return
s
;
:}
|
struct_type
.
s
{:
return
s
;
:}
|
void_type
.
v
{:
return
v
;
:}
;
;
PrimType
prim_type
=
PrimType
prim_type
=
BOOLEAN
BOOLEAN
{:
return
new
PrimType
(
BOOLEAN
,
ASTNode
.
LABCOMM_BOOLEAN
);
:}
{:
return
new
PrimType
(
BOOLEAN
,
ASTNode
.
LABCOMM_BOOLEAN
);
:}
|
BYTE
|
BYTE
{:
return
new
PrimType
(
BYTE
,
ASTNode
.
LABCOMM_BYTE
);
:}
{:
return
new
PrimType
(
BYTE
,
ASTNode
.
LABCOMM_BYTE
);
:}
|
SHORT
|
SHORT
{:
return
new
PrimType
(
SHORT
,
ASTNode
.
LABCOMM_SHORT
);
:}
{:
return
new
PrimType
(
SHORT
,
ASTNode
.
LABCOMM_SHORT
);
:}
|
INT
|
INT
{:
return
new
PrimType
(
INT
,
ASTNode
.
LABCOMM_INT
);
:}
{:
return
new
PrimType
(
INT
,
ASTNode
.
LABCOMM_INT
);
:}
|
LONG
|
LONG
{:
return
new
PrimType
(
LONG
,
ASTNode
.
LABCOMM_LONG
);
:}
{:
return
new
PrimType
(
LONG
,
ASTNode
.
LABCOMM_LONG
);
:}
|
FLOAT
|
FLOAT
{:
return
new
PrimType
(
FLOAT
,
ASTNode
.
LABCOMM_FLOAT
);
:}
{:
return
new
PrimType
(
FLOAT
,
ASTNode
.
LABCOMM_FLOAT
);
:}
|
DOUBLE
|
DOUBLE
{:
return
new
PrimType
(
DOUBLE
,
ASTNode
.
LABCOMM_DOUBLE
);
:}
{:
return
new
PrimType
(
DOUBLE
,
ASTNode
.
LABCOMM_DOUBLE
);
:}
|
STRING
|
STRING
{:
return
new
PrimType
(
STRING
,
ASTNode
.
LABCOMM_STRING
);
:}
{:
return
new
PrimType
(
STRING
,
ASTNode
.
LABCOMM_STRING
);
:}
;
;
UserType
user_type
=
UserType
user_type
=
IDENTIFIER
{:
return
new
UserType
(
IDENTIFIER
);
:}
IDENTIFIER
{:
return
new
UserType
(
IDENTIFIER
);
:}
;
;
...
@@ -107,6 +106,10 @@ StructType struct_type =
...
@@ -107,6 +106,10 @@ StructType struct_type =
STRUCT
LBRACE
var_decl_list
.
l
RBRACE
{:
return
new
StructType
(
l
);
:}
STRUCT
LBRACE
var_decl_list
.
l
RBRACE
{:
return
new
StructType
(
l
);
:}
;
;
VoidType
void_type
=
VOID
{:
return
new
VoidType
();
:}
;
List
dim_list
=
List
dim_list
=
dim
.
d
{:
return
new
List
().
add
(
d
);
:}
dim
.
d
{:
return
new
List
().
add
(
d
);
:}
|
dim_list
.
l
dim
.
d
{:
return
l
.
add
(
d
);
:}
|
dim_list
.
l
dim
.
d
{:
return
l
.
add
(
d
);
:}
...
@@ -121,7 +124,7 @@ List exp_list =
...
@@ -121,7 +124,7 @@ List exp_list =
|
exp_list
.
l
COMMA
exp
.
e
{:
return
l
.
add
(
e
);
:}
|
exp_list
.
l
COMMA
exp
.
e
{:
return
l
.
add
(
e
);
:}
;
;
Exp
exp
=
Exp
exp
=
INTEGER_LITERAL
{:
return
new
IntegerLiteral
(
INTEGER_LITERAL
);
:}
INTEGER_LITERAL
{:
return
new
IntegerLiteral
(
INTEGER_LITERAL
);
:}
|
UNDERSCORE
{:
return
new
VariableSize
();
:}
|
UNDERSCORE
{:
return
new
VariableSize
();
:}
;
;
compiler/TypeCheck.jrag
0 → 100644
View file @
b25d312c
aspect TypeCheck {
public void ASTNode.typeCheck() {
for (int i = 0; i < getNumChild(); i++) {
getChild(i).typeCheck();
}
}
syn boolean Type.isNull();
eq Type.isNull() = false;
eq VoidType.isNull() = true;
public void Field.nullTypeCheck() {
if(getType().isNull()) {
error(getName() + ": fields cannot be of type void");
}
}
public void ParseArrayType.nullTypeCheck() {
if(getType().isNull()) {
error("array elements cannot be of type void");
}
}
public void ArrayType.nullTypeCheck() {
if(getType().isNull()) {
error("array elements cannot be of type void");
}
}
}
examples/simple/Decoder.java
View file @
b25d312c
...
@@ -5,7 +5,7 @@ import java.io.InputStream;
...
@@ -5,7 +5,7 @@ import java.io.InputStream;
import
se.lth.control.labcomm.LabCommDecoderChannel
;
import
se.lth.control.labcomm.LabCommDecoderChannel
;
public
class
Decoder
public
class
Decoder
implements
theTwoInts
.
Handler
,
anotherTwoInts
.
Handler
,
IntString
.
Handler
,
TwoArrays
.
Handler
,
TwoFixedArrays
.
Handler
implements
theTwoInts
.
Handler
,
anotherTwoInts
.
Handler
,
IntString
.
Handler
,
TwoArrays
.
Handler
,
TwoFixedArrays
.
Handler
,
doavoid
.
Handler
{
{
...
@@ -20,6 +20,7 @@ public class Decoder
...
@@ -20,6 +20,7 @@ public class Decoder
IntString
.
register
(
decoder
,
this
);
IntString
.
register
(
decoder
,
this
);
TwoArrays
.
register
(
decoder
,
this
);
TwoArrays
.
register
(
decoder
,
this
);
TwoFixedArrays
.
register
(
decoder
,
this
);
TwoFixedArrays
.
register
(
decoder
,
this
);
doavoid
.
register
(
decoder
,
this
);
try
{
try
{
System
.
out
.
println
(
"Running decoder."
);
System
.
out
.
println
(
"Running decoder."
);
...
@@ -72,6 +73,10 @@ public class Decoder
...
@@ -72,6 +73,10 @@ public class Decoder
}
}
System
.
out
.
println
();
System
.
out
.
println
();
}
}
public
void
handle_doavoid
()
throws
java
.
io
.
IOException
{
System
.
out
.
println
(
"Got doavoid"
);
}
public
static
void
main
(
String
[]
arg
)
throws
Exception
{
public
static
void
main
(
String
[]
arg
)
throws
Exception
{
...
...
examples/simple/simple.lc
View file @
b25d312c
...
@@ -26,6 +26,6 @@ sample struct {
...
@@ -26,6 +26,6 @@ sample struct {
int b[2,3];
int b[2,3];
} TwoFixedArrays;
} TwoFixedArrays;
//
typedef void avoid;
typedef void avoid;
sample void doavoid;
sample
a
void doavoid;
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment