flush
[m6w6/ext-psi] / src / parser_proc.y
index efffcf79fdc0061da00aa89c609190d9d8cb0cc1..81a013ceecb7f2e899d31b6feece3b6b0434f3a8 100644 (file)
 %extra_argument {PSI_Parser *P}
 /* TOKEN is defined inside syntax_error */
 %syntax_error {
-       PSI_ParserSyntaxError(P, P->fn, P->line, "Unexpected token '%s'", TOKEN->text);
+       PSI_ParserSyntaxError(P, P->psi.file.fn, P->line, "Unexpected token '%s'", TOKEN->text);
 }
+
+%nonassoc NAME.
+
 file ::= blocks.
 
 blocks ::= block.
@@ -25,10 +28,10 @@ blocks ::= blocks block.
 block ::= COMMENT.
 
 block ::= LIB(T) QUOTED_STRING(libname) EOS. {
-       if (P->lib) {
-               PSI_ParserSyntaxError(P, P->fn, T->line, "Extra 'lib %s' statement has no effect", libname->text);
+       if (P->psi.file.ln) {
+               PSI_ParserSyntaxError(P, P->psi.file.ln, T->line, "Extra 'lib %s' statement has no effect", libname->text);
        } else {
-               P->lib = strndup(libname->text + 1, libname->size - 2);
+               P->psi.file.ln = strndup(libname->text + 1, libname->size - 2);
        }
        free(libname);
        free(T);
@@ -176,22 +179,6 @@ decl_type(type_) ::= VOID(T). {
        type_ = init_decl_type(T->type, T->text);
        free(T);
 }
-decl_type(type_) ::= CHAR(T). {
-       type_ = init_decl_type(T->type, T->text);
-       free(T);
-}
-decl_type(type_) ::= SHORT(T). {
-       type_ = init_decl_type(T->type, T->text);
-       free(T);
-}
-decl_type(type_) ::= INT(T). {
-       type_ = init_decl_type(T->type, T->text);
-       free(T);
-}
-decl_type(type_) ::= LONG(T). {
-       type_ = init_decl_type(T->type, T->text);
-       free(T);
-}
 decl_type(type_) ::= FLOAT(T). {
        type_ = init_decl_type(T->type, T->text);
        free(T);
@@ -200,11 +187,12 @@ decl_type(type_) ::= DOUBLE(T). {
        type_ = init_decl_type(T->type, T->text);
        free(T);
 }
-decl_type(type_) ::= SIZE_T(T). {
-       type_ = init_decl_type(T->type, T->text);
+/* we have to support plain int here because we have it in our lexer rules */
+decl_type(type_) ::= INT(T). {
+       type_ = init_decl_type(PSI_T_NAME, T->text);
        free(T);
 }
-decl_type(type_) ::= SINT8(T). {
+decl_type(type_) ::= INT8(T). {
        type_ = init_decl_type(T->type, T->text);
        free(T);
 }
@@ -212,7 +200,7 @@ decl_type(type_) ::= UINT8(T). {
        type_ = init_decl_type(T->type, T->text);
        free(T);
 }
-decl_type(type_) ::= SINT16(T). {
+decl_type(type_) ::= INT16(T). {
        type_ = init_decl_type(T->type, T->text);
        free(T);
 }
@@ -220,7 +208,7 @@ decl_type(type_) ::= UINT16(T). {
        type_ = init_decl_type(T->type, T->text);
        free(T);
 }
-decl_type(type_) ::= SINT32(T). {
+decl_type(type_) ::= INT32(T). {
        type_ = init_decl_type(T->type, T->text);
        free(T);
 }
@@ -228,7 +216,7 @@ decl_type(type_) ::= UINT32(T). {
        type_ = init_decl_type(T->type, T->text);
        free(T);
 }
-decl_type(type_) ::= SINT64(T). {
+decl_type(type_) ::= INT64(T). {
        type_ = init_decl_type(T->type, T->text);
        free(T);
 }
@@ -240,6 +228,11 @@ decl_type(type_) ::= NAME(T). {
        type_ = init_decl_type(T->type, T->text);
        free(T);
 }
+decl_type(type_) ::= STRUCT(S) NAME(T). {
+       type_ = init_decl_type(S->type, T->text);
+       free(S);
+       free(T);
+}
 
 %type impl {impl*}
 %destructor impl {free_impl($$);}
@@ -261,23 +254,23 @@ impl_func(func) ::= FUNCTION REFERENCE NSNAME(NAME) impl_args(args) COLON impl_t
 %type impl_def_val {impl_def_val*}
 %destructor impl_def_val {free_impl_def_val($$);}
 impl_def_val(def) ::= NULL(T). {
-       def = init_impl_def_val(T);
+       def = init_impl_def_val(T->type, T->text);
        free(T);
 }
 impl_def_val(def) ::= NUMBER(T). {
-       def = init_impl_def_val(T);
+       def = init_impl_def_val(T->type, T->text);
        free(T);
 }
 impl_def_val(def) ::= TRUE(T). {
-       def = init_impl_def_val(T);
+       def = init_impl_def_val(T->type, T->text);
        free(T);
 }
 impl_def_val(def) ::= FALSE(T). {
-       def = init_impl_def_val(T);
+       def = init_impl_def_val(T->type, T->text);
        free(T);
 }
 impl_def_val(def) ::= QUOTED_STRING(T). {
-       def = init_impl_def_val(T);
+       def = init_impl_def_val(T->type, T->text);
        free(T);
 }