summaryrefslogtreecommitdiff
path: root/libcuda
diff options
context:
space:
mode:
Diffstat (limited to 'libcuda')
-rw-r--r--libcuda/Makefile192
-rw-r--r--libcuda/cuobjdump.l96
-rw-r--r--libcuda/cuobjdump.y83
3 files changed, 288 insertions, 83 deletions
diff --git a/libcuda/Makefile b/libcuda/Makefile
index b5664db..ec69c13 100644
--- a/libcuda/Makefile
+++ b/libcuda/Makefile
@@ -73,35 +73,58 @@ endif
CPP = g++ $(SNOW)
-CC = gcc &(SNOW)
+CC = gcc $(SNOW)
CREATELIBRARY = 1
DEBUG ?= 0
ifeq ($(DEBUG),1)
CXXFLAGS += -Wall -g -fPIC $(GL)
+ CCFLAGS += -Wall -ggdb -fPIC
else
CXXFLAGS += -O3 -g -Wall -fPIC $(GL)
+ CCFLAGS += -Wall -fPIC
endif
PROG =cuda
CXX_SRCS = cuda_runtime_api.cc
+LEX_SRCS = cuobjdump.l
+YACC_SRCS = cuobjdump.y
CXXFLAGS += -DCUDART_VERSION=$(CUDART_VERSION)
+LEX = flex
+LEXFLAGS = -B
+YACC = bison
+YFLAGS = -t -d -v --report=all
.PHONY: clean
OUTPUT_DIR=../$(SIM_OBJ_FILES_DIR)/libcuda
OBJS = $(CXX_SRCS:%.cc=$(OUTPUT_DIR)/%.o)
-
-
+OBJS += $(LEX_SRCS:%.l=$(OUTPUT_DIR)/%_lexer.o)
+OBJS += $(YACC_SRCS:%.y=$(OUTPUT_DIR)/%_parser.o)
#--- Make rules ---
lib$(PROG).a: $(OBJS)
+ echo $(OBJS)
ar rcs $(OUTPUT_DIR)/lib$(PROG).a $(OBJS)
$(OUTPUT_DIR)/%.o: %.cc
$(CPP) $(CXXFLAGS) -I./ -I$(CUDA_INSTALL_PATH)/include -c $< -o $@
+
+$(OUTPUT_DIR)/%.o: %.c
+ $(CC) $(CCFLAGS) -I./ -I$(CUDA_INSTALL_PATH)/include -c $< -o $@
+
+%_parser.c: %.y
+ $(YACC) $(YFLAGS) -p $*_ -o$@ $<
+
+%_lexer.c: %.l %_parser.h
+ $(LEX) $(LEXFLAGS) -P $*_ -o$@ $<
+# The next rule means just get parser.c and you will get parser.h with it
+# in other words, get parser.c and do nothing to get parser.h
+%_parser.h: %_parser.c
+ :
+
depend:
makedepend -p$(OUTPUT_DIR)/ $(CXX_SRCS) 2> /dev/null
@@ -109,85 +132,88 @@ clean:
rm -f $(PROG)
rm -f *.o
rm -f lib$(PROG).a
+ rm -f *_parser.*
+ rm -f *_lexer.*
+
# DO NOT DELETE
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/stdlib.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/features.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/sys/cdefs.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/wordsize.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/gnu/stubs.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/gnu/stubs-64.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/sys/types.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/types.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/typesizes.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/time.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/endian.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/endian.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/byteswap.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/sys/select.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/select.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/sigset.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/time.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/sys/sysmacros.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/pthreadtypes.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/alloca.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/stdio.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/libio.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/_G_config.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/wchar.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/stdio_lim.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/sys_errlist.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/string.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/xlocale.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/assert.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/gpu-sim.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/abstract_hardware_model.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/addrdec.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/option_parser.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/shader.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/math.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/huge_val.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/huge_valf.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/huge_vall.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/inf.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/nan.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/mathdef.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/mathcalls.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/cuda-sim/ptx.tab.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/delayqueue.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/intersim/statwraper.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/gpu-misc.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/stack.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/dram.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/zlib.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/zconf.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/unistd.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/posix_opt.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/confname.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/getopt.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/scoreboard.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/mem_fetch.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/mem_fetch_status.tup
-../build/debug/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/stats.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/gpu-cache.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/tr1_hash_map.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/cuda-sim/ptx_loader.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/cuda-sim/cuda-sim.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/shader.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/cuda-sim/ptx_sim.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/cuda-sim/opcodes.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/cuda-sim/opcodes.def
-../build/debug/libcuda/cuda_runtime_api.o: ../src/cuda-sim/memory.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/cuda-sim/ptx_ir.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/cuda-sim/ptx.tab.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/cuda-sim/ptx_parser.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/gpgpusim_entrypoint.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/abstract_hardware_model.h
-../build/debug/libcuda/cuda_runtime_api.o: ../src/stream_manager.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/pthread.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/sched.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/sched.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/signal.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/setjmp.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/semaphore.h
-../build/debug/libcuda/cuda_runtime_api.o: /usr/include/bits/semaphore.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/stdlib.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/features.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/sys/cdefs.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/wordsize.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/gnu/stubs.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/gnu/stubs-64.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/sys/types.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/types.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/typesizes.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/time.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/endian.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/endian.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/byteswap.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/sys/select.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/select.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/sigset.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/time.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/sys/sysmacros.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/pthreadtypes.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/alloca.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/stdio.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/libio.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/_G_config.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/wchar.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/stdio_lim.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/sys_errlist.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/string.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/xlocale.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/assert.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/gpu-sim.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/abstract_hardware_model.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/addrdec.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/option_parser.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/shader.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/math.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/huge_val.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/huge_valf.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/huge_vall.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/inf.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/nan.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/mathdef.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/mathcalls.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/cuda-sim/ptx.tab.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/delayqueue.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/intersim/statwraper.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/gpu-misc.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/stack.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/dram.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/zlib.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/zconf.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/unistd.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/posix_opt.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/confname.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/getopt.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/scoreboard.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/mem_fetch.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/mem_fetch_status.tup
+../build/release/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/stats.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/gpu-cache.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/tr1_hash_map.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/cuda-sim/ptx_loader.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/cuda-sim/cuda-sim.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/gpgpu-sim/shader.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/cuda-sim/ptx_sim.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/cuda-sim/opcodes.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/cuda-sim/opcodes.def
+../build/release/libcuda/cuda_runtime_api.o: ../src/cuda-sim/memory.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/cuda-sim/ptx_ir.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/cuda-sim/ptx.tab.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/cuda-sim/ptx_parser.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/gpgpusim_entrypoint.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/abstract_hardware_model.h
+../build/release/libcuda/cuda_runtime_api.o: ../src/stream_manager.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/pthread.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/sched.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/sched.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/signal.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/setjmp.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/semaphore.h
+../build/release/libcuda/cuda_runtime_api.o: /usr/include/bits/semaphore.h
diff --git a/libcuda/cuobjdump.l b/libcuda/cuobjdump.l
new file mode 100644
index 0000000..fcd43f8
--- /dev/null
+++ b/libcuda/cuobjdump.l
@@ -0,0 +1,96 @@
+ /*Lex file for output of cuobjdump*/
+%{
+#include <stdio.h>
+#include <string.h>
+#include "cuobjdump_parser.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+#define YYDEBUG 1
+
+#define yylval cuobjdump_lval
+
+void cuobjdump_error(const char*);
+%}
+
+%option stack
+%option noyywrap
+%option yylineno
+
+%s ptxcode
+%s sasscode
+%s elfcode
+%s header
+%s endheader
+
+alpha [a-zA-Z]
+numeric [0-9]
+whitespace [ \t]
+newline [\n]
+notnewline [^\n]
+newlines {newline}+
+%%
+
+
+"ptxasOptions"{notnewline}*{newline}
+[1-9]{numeric}* yylval.string_value = strdup(yytext); return DECIMAL;
+
+
+"Fatbin ptx code:"{newline} {
+ yy_push_state(ptxcode);
+ yy_push_state(header);
+ yylval.string_value = strdup(yytext);
+ return PTXHEADER;
+}
+"Fatbin elf code:"{newline} {
+ yy_push_state(elfcode);
+ yy_push_state(header);
+ yylval.string_value = strdup(yytext);
+ return ELFHEADER;
+}
+ /*PTX code tokens*/
+<ptxcode>{notnewline}*{newline} yylval.string_value = strdup(yytext); return PTXLINE;
+
+ /*ELF code tokens*/
+<elfcode>{whitespace}*"code for sm_"{numeric}+{newline} {
+ BEGIN(sasscode);
+ yylval.string_value = strdup(yytext);
+ return SASSLINE;
+}
+<elfcode>{notnewline}*{newline} yylval.string_value = strdup(yytext); return ELFLINE;
+
+ /*SASS code tokens*/
+<sasscode>{notnewline}*{newline} yylval.string_value = strdup(yytext); return SASSLINE;
+
+ /*Header tokens*/
+<header>[[:alnum:]_]+ yylval.string_value = strdup(yytext); return IDENTIFIER;
+<header>"================" return H_SEPARATOR;
+<header>"arch = " return H_ARCH;
+<header>"code version = " return H_CODEVERSION;
+<header>\[{numeric},{numeric}\] return CODEVERSION;
+<header>"producer = " return H_PRODUCER;
+<header>"host = " return H_HOST;
+<header>"compile_size = " return H_COMPILESIZE;
+<header>"identifier = " BEGIN(endheader); return H_IDENTIFIER;
+<header>"has debug info"{newline}
+
+ /* Looking for the identifier (filename) then the header is done */
+<endheader>[[:alnum:]_\.]+{newline} yylval.string_value = strdup(yytext); yy_pop_state(); return FILENAME;
+
+
+{newline} return NEWLINE;
+
+ /*Reached end of file*/
+<<EOF>> return 0;
+
+ /*No other rule matched. Throw an error*/
+. cuobjdump_error("Invalid token");
+
+%%
+void cuobjdump_error(const char* message)
+{
+ printf(" "); printf(message); printf(" near \""); printf(yytext); printf("\"");
+ printf(" on line ");
+ char line[5]; sprintf(line, "%i", yylineno); printf(line);
+ printf("\n");
+}
diff --git a/libcuda/cuobjdump.y b/libcuda/cuobjdump.y
new file mode 100644
index 0000000..0b20a83
--- /dev/null
+++ b/libcuda/cuobjdump.y
@@ -0,0 +1,83 @@
+ /*Yacc file for output of cuobjdump*/
+%{
+#include <stdio.h>
+
+int yylex(void);
+void yyerror(const char*);
+extern void addCuobjdumpSection(int sectiontype);
+void setCuobjdumparch(const char* arch);
+void setCuobjdumpidentifier(const char* identifier);
+void setCuobjdumpptxfilename(const char* filename);
+void setCuobjdumpelffilename(const char* filename);
+void setCuobjdumpsassfilename(const char* filename);
+int elfserial = 1;
+int ptxserial = 1;
+FILE *ptxfile;
+FILE *elffile;
+FILE *sassfile;
+char filename [1024];
+%}
+%union {
+ char* string_value;
+}
+%token <string_value> H_SEPARATOR H_ARCH H_CODEVERSION H_PRODUCER H_HOST H_COMPILESIZE H_IDENTIFIER
+%token <string_value> CODEVERSION
+%token <string_value> STRING
+%token <string_value> FILENAME
+%token <string_value> DECIMAL
+%token <string_value> PTXHEADER ELFHEADER
+%token <string_value> PTXLINE
+%token <string_value> ELFLINE
+%token <string_value> SASSLINE
+%token <string_value> IDENTIFIER
+%token <string_value> NEWLINE
+
+%%
+
+program : emptylines section
+ | program section;
+
+emptylines : emptylines NEWLINE
+ | ;
+
+section : PTXHEADER {
+ addCuobjdumpSection(0);
+ snprintf(filename, 1024, "_cuobjdump_%d.ptx", ptxserial++);
+ ptxfile = fopen(filename, "w");
+ setCuobjdumpptxfilename(filename);
+ } headerinfo ptxcode {
+ fclose(ptxfile);
+ }
+ | ELFHEADER {
+ addCuobjdumpSection(1);
+ snprintf(filename, 1024, "_cuobjdump_%d.elf", elfserial);
+ elffile = fopen(filename, "w");
+ setCuobjdumpelffilename(filename);
+ } headerinfo elfcode {
+ fclose(elffile);
+ snprintf(filename, 1024, "_cuobjdump_%d.sass", elfserial++);
+ sassfile = fopen(filename, "w");
+ setCuobjdumpsassfilename(filename);
+ } sasscode {
+ fclose(sassfile);
+ };
+
+headerinfo : H_SEPARATOR NEWLINE
+ H_ARCH IDENTIFIER NEWLINE
+ H_CODEVERSION CODEVERSION NEWLINE
+ H_PRODUCER IDENTIFIER NEWLINE
+ H_HOST IDENTIFIER NEWLINE
+ H_COMPILESIZE IDENTIFIER NEWLINE
+ H_IDENTIFIER FILENAME {setCuobjdumparch($4); setCuobjdumpidentifier($19);};
+
+ptxcode : ptxcode PTXLINE {fprintf(ptxfile, "%s", $2);}
+ | ;
+
+elfcode : elfcode ELFLINE {fprintf(elffile, "%s", $2);}
+ | ;
+
+sasscode : sasscode SASSLINE {fprintf(sassfile, "%s", $2)}
+ | ;
+
+
+%%