summaryrefslogtreecommitdiff
path: root/src/parser.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.y')
-rw-r--r--src/parser.y80
1 files changed, 64 insertions, 16 deletions
diff --git a/src/parser.y b/src/parser.y
index e63935a..5f7b4bb 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -14,20 +14,22 @@ void yyerror(const char *s);
%union {
int i_val;
- float f_val;
char *s_val;
char *symbol;
+ char *modifier;
+ char *directive;
}
-%token <i_val> T_INTEGER
-%token <f_val> T_FLOAT
-%token <s_val> T_STRING
-%token <symbol> T_SYMBOL
-%token <symbol> T_INSTRUCTION
-%token T_ENDL
-%token T_COMMA
-%token T_OPENPAREN
-%token T_CLOSEPAREN
+%token <i_val> T_INTEGER
+%token <s_val> T_STRING
+%token <symbol> T_SYMBOL
+%token <directive> T_DIRECTIVE
+%token <symbol> T_LABEL
+%token <modifier> T_MODIFIER
+%token T_ENDL
+%token T_COMMA
+%token T_OPENPAREN
+%token T_CLOSEPAREN
%%
asm:
statements
@@ -39,48 +41,94 @@ statements:
;
statement:
- instructions
+ label
+ | directives
+ | instructions
| T_ENDL
;
+label:
+ T_LABEL T_ENDL
+ {
+ printf("Found Label: %s\n", $1);
+ };
+
instructions:
rb_type
| i_type
| s_type
| u_type
| j_type
+ | i_type_modifier
+ | s_type_modifier
+ | pseudo_type
;
rb_type:
- T_INSTRUCTION T_SYMBOL T_COMMA T_SYMBOL T_COMMA T_SYMBOL T_ENDL
+ T_SYMBOL T_SYMBOL T_COMMA T_SYMBOL T_COMMA T_SYMBOL T_ENDL
{
printf("Read instruction: %s(%s, %s, %s)\n", $1, $2, $4, $6);
};
i_type:
- T_INSTRUCTION T_SYMBOL T_COMMA T_SYMBOL T_COMMA T_INTEGER T_ENDL
+ T_SYMBOL T_SYMBOL T_COMMA T_SYMBOL T_COMMA T_INTEGER T_ENDL
{
printf("Read instruction: %s(%s, %s, %d)\n", $1, $2, $4, $6);
};
+i_type_modifier:
+ T_SYMBOL T_SYMBOL T_COMMA T_SYMBOL T_COMMA T_MODIFIER T_OPENPAREN T_SYMBOL T_CLOSEPAREN T_ENDL
+ {
+ printf("Read instruction: %s(%s, %s, %s of %s)\n", $1, $2, $4, $6, $8);
+ };
+
s_type:
- T_INSTRUCTION T_SYMBOL T_COMMA T_INTEGER T_OPENPAREN T_SYMBOL T_CLOSEPAREN T_ENDL
+ T_SYMBOL T_SYMBOL T_COMMA T_INTEGER T_OPENPAREN T_SYMBOL T_CLOSEPAREN T_ENDL
{
printf("Read instruction: %s(%s, %s + %d)\n", $1, $2, $6, $4);
};
+s_type_modifier:
+ T_SYMBOL T_SYMBOL T_COMMA T_MODIFIER T_OPENPAREN T_SYMBOL T_CLOSEPAREN T_ENDL
+ {
+ printf("Read instruction: %s(%s, %s of %s)\n", $1, $2, $4, $6);
+ };
+
u_type:
- T_INSTRUCTION T_SYMBOL T_COMMA T_INTEGER T_ENDL
+ T_SYMBOL T_SYMBOL T_COMMA T_INTEGER T_ENDL
{
printf("Read instruction: %s(%s, %d)\n", $1, $2, $4);
};
j_type:
- T_INSTRUCTION T_SYMBOL T_COMMA T_SYMBOL T_ENDL
+ T_SYMBOL T_SYMBOL T_COMMA T_SYMBOL T_ENDL
{
printf("Read instruction: %s(%s, %s)\n", $1, $2, $4);
};
+pseudo_type:
+ T_SYMBOL T_SYMBOL T_ENDL
+ {
+ printf("Read Pseudo Instruction: %s(%s)\n", $1, $2);
+ };
+
+directives:
+ directive_int
+ | directive_string
+ ;
+
+directive_int:
+ T_DIRECTIVE T_INTEGER T_ENDL
+ {
+ printf("Read directive %s %d\n", $1, $2);
+ };
+
+directive_string:
+ T_DIRECTIVE T_STRING T_ENDL
+ {
+ printf("Read directive %s %s\n", $1, $2);
+ };
+
%%
void yyerror(const char *s) {