From 8a57bedc04fff7a92ef6d2762cfe5fc17050f021 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 30 Apr 2021 22:22:13 +0530 Subject: add yacc programs --- .direnv/flake-profile | 2 +- .direnv/flake-profile.rc | 22 +++++++------- 10/input | 1 + 10/main.l | 22 ++++++++++++++ 10/main.y | 33 +++++++++++++++++++++ 11/input | 1 + 11/main.l | 33 +++++++++++++++++++++ 11/main.y | 76 ++++++++++++++++++++++++++++++++++++++++++++++++ 6/main.l | 16 ++++++++++ 6/main.y | 28 ++++++++++++++++++ 7/main.l | 22 ++++++++++++++ 7/main.y | 34 ++++++++++++++++++++++ 8/input | 1 + 8/main.l | 15 ++++++++++ 8/main.y | 28 ++++++++++++++++++ 9/input | 1 + 9/main.l | 16 ++++++++++ 9/main.y | 30 +++++++++++++++++++ flake.nix | 73 ++++++++++++++++++++++++++++++++++++---------- 19 files changed, 426 insertions(+), 28 deletions(-) create mode 100644 10/input create mode 100644 10/main.l create mode 100644 10/main.y create mode 100644 11/input create mode 100644 11/main.l create mode 100644 11/main.y create mode 100644 6/main.l create mode 100644 6/main.y create mode 100644 7/main.l create mode 100644 7/main.y create mode 100644 8/input create mode 100644 8/main.l create mode 100644 8/main.y create mode 100644 9/input create mode 100644 9/main.l create mode 100644 9/main.y diff --git a/.direnv/flake-profile b/.direnv/flake-profile index e2fe106..444fae1 120000 --- a/.direnv/flake-profile +++ b/.direnv/flake-profile @@ -1 +1 @@ -/nix/store/n8fwn588p25fgik3z6jr49x7l7ypsvkc-nix-shell-env \ No newline at end of file +/nix/store/q89kklg6h19vm15s7wh5lwjrj1jdz7k4-nix-shell-env \ No newline at end of file diff --git a/.direnv/flake-profile.rc b/.direnv/flake-profile.rc index 34911e2..611c1da 100644 --- a/.direnv/flake-profile.rc +++ b/.direnv/flake-profile.rc @@ -32,7 +32,7 @@ NIX_CC=/nix/store/gdg97kdw8k7nqg704g4gm3cn8280bmgr-gcc-wrapper-10.2.0 export NIX_CC NIX_CC_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu=1 export NIX_CC_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu -NIX_CFLAGS_COMPILE=' -frandom-seed=n8fwn588p2 -isystem /nix/store/qrq8px6m7v85j9jcp7zzk1pkawmrll43-flex-2.6.4/include -isystem /nix/store/qrq8px6m7v85j9jcp7zzk1pkawmrll43-flex-2.6.4/include' +NIX_CFLAGS_COMPILE=' -frandom-seed=q89kklg6h1 -isystem /nix/store/qrq8px6m7v85j9jcp7zzk1pkawmrll43-flex-2.6.4/include -isystem /nix/store/qrq8px6m7v85j9jcp7zzk1pkawmrll43-flex-2.6.4/include -isystem /nix/store/qrq8px6m7v85j9jcp7zzk1pkawmrll43-flex-2.6.4/include -isystem /nix/store/qrq8px6m7v85j9jcp7zzk1pkawmrll43-flex-2.6.4/include' export NIX_CFLAGS_COMPILE NIX_ENFORCE_NO_NATIVE=1 export NIX_ENFORCE_NO_NATIVE @@ -55,7 +55,7 @@ export OBJDUMP OPTERR=1 OPTIND=1 OSTYPE=linux-gnu -PATH=/nix/store/qrq8px6m7v85j9jcp7zzk1pkawmrll43-flex-2.6.4/bin:/nix/store/caxc3dmxqwy1ks03han5mlkr7sy6wh8y-gnum4-1.4.18/bin:/nix/store/ybl3zad6ihv60d4w0nprcj5a9g94z1z3-bison-3.7.6/bin:/nix/store/gdg97kdw8k7nqg704g4gm3cn8280bmgr-gcc-wrapper-10.2.0/bin:/nix/store/sjfbbay5xhifzpipm4k007svlrpjbx2p-gcc-10.2.0/bin:/nix/store/l6blpd7anij8pzzgr30srmf919rg169v-glibc-2.32-39-bin/bin:/nix/store/485sqh570qixsv9wk0d59vrvs35pqja0-coreutils-8.32/bin:/nix/store/6zb7whdhsn7pq9vw086z5j3kw0qpgr3m-binutils-wrapper-2.35.1/bin:/nix/store/fx4kvd2440kgrq73irdkmwqf6vvzwf2m-binutils-2.35.1/bin:/nix/store/q5yia079krwdhp1ld00fv44sy072q5f5-patchelf-0.12/bin:/nix/store/485sqh570qixsv9wk0d59vrvs35pqja0-coreutils-8.32/bin:/nix/store/a7kzz70vzpsq3s2pgfw49q8ll356l13f-findutils-4.7.0/bin:/nix/store/b2rmyng3dryanc5g1jnsqqrbaclw52b3-diffutils-3.7/bin:/nix/store/xyd1a8i3sn1iah73sr3p15fx3y9v0rkc-gnused-4.8/bin:/nix/store/x604v97a5yi0yc07zfid76n7xqbcykmj-gnugrep-3.6/bin:/nix/store/3w93n4d1f0gj7xc2x7si46njlz9vkad9-gawk-5.1.0/bin:/nix/store/ym4ygxjyyym82j6mc3bjzx6527r1j9rj-gnutar-1.34/bin:/nix/store/fj1cn54yvinnd8ypi202jq3kd761d5sh-gzip-1.10/bin:/nix/store/ip4mcnr199dw3f750ka6543zgjpr3pgd-bzip2-1.0.6.0.2-bin/bin:/nix/store/chy0dyh9imv0qj4x3xd1a2w4rw9v77pj-gnumake-4.3/bin:/nix/store/p886sbvvzpqpxnb8a60djpp8dir9zfp9-bash-4.4-p23/bin:/nix/store/ay3j8pm23pilyj8gqqj7rkbzk7mdcfr0-patch-2.7.6/bin:/nix/store/k25g03svkjzl74c1bqkzx9anpg0438v1-xz-5.2.5-bin/bin +PATH=/nix/store/gdg97kdw8k7nqg704g4gm3cn8280bmgr-gcc-wrapper-10.2.0/bin:/nix/store/sjfbbay5xhifzpipm4k007svlrpjbx2p-gcc-10.2.0/bin:/nix/store/l6blpd7anij8pzzgr30srmf919rg169v-glibc-2.32-39-bin/bin:/nix/store/485sqh570qixsv9wk0d59vrvs35pqja0-coreutils-8.32/bin:/nix/store/6zb7whdhsn7pq9vw086z5j3kw0qpgr3m-binutils-wrapper-2.35.1/bin:/nix/store/fx4kvd2440kgrq73irdkmwqf6vvzwf2m-binutils-2.35.1/bin:/nix/store/qrq8px6m7v85j9jcp7zzk1pkawmrll43-flex-2.6.4/bin:/nix/store/caxc3dmxqwy1ks03han5mlkr7sy6wh8y-gnum4-1.4.18/bin:/nix/store/ybl3zad6ihv60d4w0nprcj5a9g94z1z3-bison-3.7.6/bin:/nix/store/q5yia079krwdhp1ld00fv44sy072q5f5-patchelf-0.12/bin:/nix/store/485sqh570qixsv9wk0d59vrvs35pqja0-coreutils-8.32/bin:/nix/store/a7kzz70vzpsq3s2pgfw49q8ll356l13f-findutils-4.7.0/bin:/nix/store/b2rmyng3dryanc5g1jnsqqrbaclw52b3-diffutils-3.7/bin:/nix/store/xyd1a8i3sn1iah73sr3p15fx3y9v0rkc-gnused-4.8/bin:/nix/store/x604v97a5yi0yc07zfid76n7xqbcykmj-gnugrep-3.6/bin:/nix/store/3w93n4d1f0gj7xc2x7si46njlz9vkad9-gawk-5.1.0/bin:/nix/store/ym4ygxjyyym82j6mc3bjzx6527r1j9rj-gnutar-1.34/bin:/nix/store/fj1cn54yvinnd8ypi202jq3kd761d5sh-gzip-1.10/bin:/nix/store/ip4mcnr199dw3f750ka6543zgjpr3pgd-bzip2-1.0.6.0.2-bin/bin:/nix/store/chy0dyh9imv0qj4x3xd1a2w4rw9v77pj-gnumake-4.3/bin:/nix/store/p886sbvvzpqpxnb8a60djpp8dir9zfp9-bash-4.4-p23/bin:/nix/store/ay3j8pm23pilyj8gqqj7rkbzk7mdcfr0-patch-2.7.6/bin:/nix/store/k25g03svkjzl74c1bqkzx9anpg0438v1-xz-5.2.5-bin/bin export PATH PIPESTATUS=([0]="0") PS4='+ ' @@ -107,13 +107,13 @@ doInstallCheck= export doInstallCheck dontAddDisableDepTrack=1 export dontAddDisableDepTrack -envHostHostHooks=([0]="ccWrapper_addCVars" [1]="bintoolsWrapper_addLDVars") -envHostTargetHooks=([0]="ccWrapper_addCVars" [1]="bintoolsWrapper_addLDVars") +envHostHostHooks=([0]="ccWrapper_addCVars" [1]="bintoolsWrapper_addLDVars" [2]="ccWrapper_addCVars") +envHostTargetHooks=([0]="ccWrapper_addCVars" [1]="bintoolsWrapper_addLDVars" [2]="ccWrapper_addCVars") fixupOutputHooks=([0]="if [ -z \"\${dontPatchELF-}\" ]; then patchELF \"\$prefix\"; fi" [1]="_makeSymlinksRelative" [2]="if [ -z \"\${dontGzipMan-}\" ]; then compressManPages \"\$prefix\"; fi" [3]="_doStrip" [4]="patchShebangsAuto" [5]="_pruneLibtoolFiles" [6]="if [[ -z \"\${noAuditTmpdir-}\" && -e \"\$prefix\" ]]; then auditTmpdir \"\$prefix\"; fi" [7]="_moveSystemdUserUnits" [8]="_moveSbin" [9]="_moveLib64") initialPath='/nix/store/485sqh570qixsv9wk0d59vrvs35pqja0-coreutils-8.32 /nix/store/a7kzz70vzpsq3s2pgfw49q8ll356l13f-findutils-4.7.0 /nix/store/b2rmyng3dryanc5g1jnsqqrbaclw52b3-diffutils-3.7 /nix/store/xyd1a8i3sn1iah73sr3p15fx3y9v0rkc-gnused-4.8 /nix/store/x604v97a5yi0yc07zfid76n7xqbcykmj-gnugrep-3.6 /nix/store/3w93n4d1f0gj7xc2x7si46njlz9vkad9-gawk-5.1.0 /nix/store/ym4ygxjyyym82j6mc3bjzx6527r1j9rj-gnutar-1.34 /nix/store/fj1cn54yvinnd8ypi202jq3kd761d5sh-gzip-1.10 /nix/store/ip4mcnr199dw3f750ka6543zgjpr3pgd-bzip2-1.0.6.0.2-bin /nix/store/chy0dyh9imv0qj4x3xd1a2w4rw9v77pj-gnumake-4.3 /nix/store/p886sbvvzpqpxnb8a60djpp8dir9zfp9-bash-4.4-p23 /nix/store/ay3j8pm23pilyj8gqqj7rkbzk7mdcfr0-patch-2.7.6 /nix/store/k25g03svkjzl74c1bqkzx9anpg0438v1-xz-5.2.5-bin' name=nix-shell export name -nativeBuildInputs='/nix/store/qrq8px6m7v85j9jcp7zzk1pkawmrll43-flex-2.6.4 /nix/store/ybl3zad6ihv60d4w0nprcj5a9g94z1z3-bison-3.7.6 /nix/store/gdg97kdw8k7nqg704g4gm3cn8280bmgr-gcc-wrapper-10.2.0' +nativeBuildInputs='/nix/store/gdg97kdw8k7nqg704g4gm3cn8280bmgr-gcc-wrapper-10.2.0 /nix/store/qrq8px6m7v85j9jcp7zzk1pkawmrll43-flex-2.6.4 /nix/store/ybl3zad6ihv60d4w0nprcj5a9g94z1z3-bison-3.7.6 /nix/store/gdg97kdw8k7nqg704g4gm3cn8280bmgr-gcc-wrapper-10.2.0' export nativeBuildInputs nobuildPhase=$'echo\necho "This derivation is not meant to be built, aborting";\necho\nexit 1\n' export nobuildPhase @@ -135,7 +135,7 @@ export patches phases=nobuildPhase export phases pkg=/nix/store/gdg97kdw8k7nqg704g4gm3cn8280bmgr-gcc-wrapper-10.2.0 -pkgsBuildHost=([0]="/nix/store/qrq8px6m7v85j9jcp7zzk1pkawmrll43-flex-2.6.4" [1]="/nix/store/caxc3dmxqwy1ks03han5mlkr7sy6wh8y-gnum4-1.4.18" [2]="/nix/store/ybl3zad6ihv60d4w0nprcj5a9g94z1z3-bison-3.7.6" [3]="/nix/store/gdg97kdw8k7nqg704g4gm3cn8280bmgr-gcc-wrapper-10.2.0" [4]="/nix/store/6zb7whdhsn7pq9vw086z5j3kw0qpgr3m-binutils-wrapper-2.35.1" [5]="/nix/store/q5yia079krwdhp1ld00fv44sy072q5f5-patchelf-0.12" [6]="/nix/store/mjjy30kxz775bhhi6j9phw81qh6dsbrf-move-docs.sh" [7]="/nix/store/kxw6q8v6isaqjm702d71n2421cxamq68-make-symlinks-relative.sh" [8]="/nix/store/cl3qd985p1yxyfkj96v0hqxiy3w69xq5-compress-man-pages.sh" [9]="/nix/store/h54dzwd7rdh2jlcv91424csl6d0ccgjy-strip.sh" [10]="/nix/store/bnj8d7mvbkg3vdb07yz74yhl3g107qq5-patch-shebangs.sh" [11]="/nix/store/cickvswrvann041nqxb0rxilc46svw1n-prune-libtool-files.sh" [12]="/nix/store/8zxndz5ag0p6s526c2xyllhk1nrn4c3i-audit-tmpdir.sh" [13]="/nix/store/c8n9kcdddp9np665xz6ri61b383nxvz8-move-systemd-user-units.sh" [14]="/nix/store/1i5y55x4b4m9qkx5dqbmr1r6bvrqbanw-multiple-outputs.sh" [15]="/nix/store/kd4xwxjpjxi71jkm6ka0np72if9rm3y0-move-sbin.sh" [16]="/nix/store/fyaryjvghbkpfnsyw97hb3lyb37s1pd6-move-lib64.sh" [17]="/nix/store/ngg1cv31c8c7bcm2n8ww4g06nq7s4zhm-set-source-date-epoch-to-latest.sh" [18]="/nix/store/pr6nzbscdpg94yvr151lrif2kg0csx7b-reproducible-builds.sh") +pkgsBuildHost=([0]="/nix/store/gdg97kdw8k7nqg704g4gm3cn8280bmgr-gcc-wrapper-10.2.0" [1]="/nix/store/6zb7whdhsn7pq9vw086z5j3kw0qpgr3m-binutils-wrapper-2.35.1" [2]="/nix/store/qrq8px6m7v85j9jcp7zzk1pkawmrll43-flex-2.6.4" [3]="/nix/store/caxc3dmxqwy1ks03han5mlkr7sy6wh8y-gnum4-1.4.18" [4]="/nix/store/ybl3zad6ihv60d4w0nprcj5a9g94z1z3-bison-3.7.6" [5]="/nix/store/gdg97kdw8k7nqg704g4gm3cn8280bmgr-gcc-wrapper-10.2.0" [6]="/nix/store/q5yia079krwdhp1ld00fv44sy072q5f5-patchelf-0.12" [7]="/nix/store/mjjy30kxz775bhhi6j9phw81qh6dsbrf-move-docs.sh" [8]="/nix/store/kxw6q8v6isaqjm702d71n2421cxamq68-make-symlinks-relative.sh" [9]="/nix/store/cl3qd985p1yxyfkj96v0hqxiy3w69xq5-compress-man-pages.sh" [10]="/nix/store/h54dzwd7rdh2jlcv91424csl6d0ccgjy-strip.sh" [11]="/nix/store/bnj8d7mvbkg3vdb07yz74yhl3g107qq5-patch-shebangs.sh" [12]="/nix/store/cickvswrvann041nqxb0rxilc46svw1n-prune-libtool-files.sh" [13]="/nix/store/8zxndz5ag0p6s526c2xyllhk1nrn4c3i-audit-tmpdir.sh" [14]="/nix/store/c8n9kcdddp9np665xz6ri61b383nxvz8-move-systemd-user-units.sh" [15]="/nix/store/1i5y55x4b4m9qkx5dqbmr1r6bvrqbanw-multiple-outputs.sh" [16]="/nix/store/kd4xwxjpjxi71jkm6ka0np72if9rm3y0-move-sbin.sh" [17]="/nix/store/fyaryjvghbkpfnsyw97hb3lyb37s1pd6-move-lib64.sh" [18]="/nix/store/ngg1cv31c8c7bcm2n8ww4g06nq7s4zhm-set-source-date-epoch-to-latest.sh" [19]="/nix/store/pr6nzbscdpg94yvr151lrif2kg0csx7b-reproducible-builds.sh") postFixupHooks=([0]="_multioutPropagateDev") postUnpackHooks=([0]="_updateSourceDateEpochFromSourceRoot") preConfigureHooks=([0]="_multioutConfig") @@ -955,7 +955,7 @@ getRole () role_post='_FOR_TARGET' ;; *) - echo "binutils-wrapper-2.35.1: used as improper sort of dependency" > 2; + echo "gcc-wrapper-10.2.0: used as improper sort of dependency" > 2; return 1 ;; esac @@ -972,16 +972,16 @@ getTargetRoleWrapper () { case $targetOffset in -1) - export NIX_BINTOOLS_WRAPPER_TARGET_BUILD_x86_64_unknown_linux_gnu=1 + export NIX_CC_WRAPPER_TARGET_BUILD_x86_64_unknown_linux_gnu=1 ;; 0) - export NIX_BINTOOLS_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu=1 + export NIX_CC_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu=1 ;; 1) - export NIX_BINTOOLS_WRAPPER_TARGET_TARGET_x86_64_unknown_linux_gnu=1 + export NIX_CC_WRAPPER_TARGET_TARGET_x86_64_unknown_linux_gnu=1 ;; *) - echo "binutils-wrapper-2.35.1: used as improper sort of dependency" > 2; + echo "gcc-wrapper-10.2.0: used as improper sort of dependency" > 2; return 1 ;; esac diff --git a/10/input b/10/input new file mode 100644 index 0000000..fdfb61b --- /dev/null +++ b/10/input @@ -0,0 +1 @@ +1+2-3*6/2 diff --git a/10/main.l b/10/main.l new file mode 100644 index 0000000..9962054 --- /dev/null +++ b/10/main.l @@ -0,0 +1,22 @@ +%{ +extern int yylval; +%} + +d [0-9]+ + +%% +"+" return ADD; +"-" return SUB; +"*" return MUL; +"/" return DIV; +[0-9]+ { + yylval = atoi(yytext); + return NUM; +}; +. return yytext[0]; +\n return 0; +%% + +int yywrap() { + return 1; +} diff --git a/10/main.y b/10/main.y new file mode 100644 index 0000000..f45e23f --- /dev/null +++ b/10/main.y @@ -0,0 +1,33 @@ +%{ +#include +#include +int yylex(); +int yyerror(char *); +%} + +%token ADD SUB MUL DIV NUM +%left ADD SUB MUL DIV + +%% +R: E { + printf("result: %d", $$); + return 0; + } +E: E ADD T { $$ = $1 + $3; } + | E SUB T { $$ = $1 - $3; } + | T + ; +T: T MUL NUM { $$ = $1 * $3; } + | T DIV NUM { $$ = $1 / $3; } + | NUM { $$ = $1; } + ; +%% + +int main() { + yyparse(); +} + +int yyerror(char *s) { + printf("error: %s", s); + exit(0); +} diff --git a/11/input b/11/input new file mode 100644 index 0000000..7e9718c --- /dev/null +++ b/11/input @@ -0,0 +1 @@ +for(i=0;i!=20;i--){for(;;){for(;;)i=1;}} diff --git a/11/main.l b/11/main.l new file mode 100644 index 0000000..5cc2a4e --- /dev/null +++ b/11/main.l @@ -0,0 +1,33 @@ +%{ +#include "y.tab.h" +extern int yylval; +%} + +%% +"++" return INC; +"--" return DEC; +"+" return ADD; +"-" return SUB; +"*" return MUL; +"/" return DIV; +"=" return ASSIGN; +"==" return EQ; +"!=" return NEQ; +"<" return LT; +">" return GT; +"<=" return LTE; +">=" return GTE; +";" return ENDL; +"for" return FOR; +[0-9]+ { + yylval = atoi(yytext); + return NUM; +}; +[a-zA-Z_][a-zA-Z_0-9]* return ID; +. return yytext[0]; +\n return 0; +%% + +int yywrap() { + return 1; +} diff --git a/11/main.y b/11/main.y new file mode 100644 index 0000000..9ed51a0 --- /dev/null +++ b/11/main.y @@ -0,0 +1,76 @@ +%{ +#include +#include +#include "lex.yy.cc" +int yylex(); +int yyerror(char *); +int loop_count = 0; +%} + +%token ADD SUB MUL DIV INC DEC +%token LT GT LTE GTE EQ NEQ ASSIGN +%token FOR +%token ENDL +%token NUM ID + +%start statement + +%% +primary_expr: NUM + | ID + ; + +postfix_expr: postfix_expr INC + | postfix_expr DEC + | primary_expr + ; + +unary_expr: INC unary_expr + | DEC unary_expr + | postfix_expr + ; + +boolean_expr: unary_expr LT unary_expr + | unary_expr GT unary_expr + | unary_expr LTE unary_expr + | unary_expr GTE unary_expr + | unary_expr EQ unary_expr + | unary_expr NEQ unary_expr + ; + +assignment_expr: unary_expr ASSIGN unary_expr + | unary_expr ASSIGN boolean_expr + ; + +expression: unary_expr + | boolean_expr + | assignment_expr + ; + +block: '{' statement block_cont + ; +block_cont: statement block_cont + | '}' + ; + +statement: expression ENDL + | block + | for_expr {loop_count++;} + | ENDL + ; + +for_expr: FOR '(' statement statement expression ')' statement + | FOR '(' statement statement ')' statement + ; + +%% + +int main() { + yyparse(); + printf("valid expression, nested %d", loop_count); +} + +int yyerror(char *s) { + printf("error: %s", s); + exit(0); +} diff --git a/6/main.l b/6/main.l new file mode 100644 index 0000000..55dac30 --- /dev/null +++ b/6/main.l @@ -0,0 +1,16 @@ +%{ +#include "y.tab.h" +#include +%} + +%% + +a return A; +b return B; +. return yytext[0]; +\n return 0; +%% + +int yywrap() { + return 1; +} diff --git a/6/main.y b/6/main.y new file mode 100644 index 0000000..25005df --- /dev/null +++ b/6/main.y @@ -0,0 +1,28 @@ +%{ +#include +#include +int yylex(); +int yyerror(char *); +%} + +%token A B ERR + +%% + +S: + A S B + | + ; + +%% + +int yyerror(char *s) { + printf("error: %s", s); + exit(0); +} + +int main() { + yyparse(); + printf("valid string\n"); + return 0; +} diff --git a/7/main.l b/7/main.l new file mode 100644 index 0000000..7e1332f --- /dev/null +++ b/7/main.l @@ -0,0 +1,22 @@ +%{ +#include "y.tab.h" +extern int yylval; +%} + +%% +[0-9]+ { + yylval = atoi(yytext); + return NUM; +} +"+" return ADD;; +"-" return SUB; +"*" return MUL; +"/" return DIV; +"(" return LPAR; +")" return RPAR; +\n return 0; +%% + +int yywrap() { + return 1; +} diff --git a/7/main.y b/7/main.y new file mode 100644 index 0000000..26a2007 --- /dev/null +++ b/7/main.y @@ -0,0 +1,34 @@ +%{ +#include +#include +int yylex(); +int yyerror(char *); +%} + +%token NUM ADD SUB MUL DIV LPAR RPAR +%left ADD SUB MUL DIV +%right NEG + +%% + +S: + E { printf("\n"); }; +E: + E ADD E { printf("+ "); } + | E MUL E { printf("* "); } + | E SUB E { printf("- "); } + | E DIV E { printf("/ "); } + | LPAR E RPAR + | SUB E %prec NEG { printf("- "); } + | NUM { printf("%d ", yylval); } + ; +%% + +int main() { + yyparse(); +} + +int yyerror(char *s) { + printf("error: %s", s); + exit(0); +} diff --git a/8/input b/8/input new file mode 100644 index 0000000..5c11124 --- /dev/null +++ b/8/input @@ -0,0 +1 @@ +aaaab diff --git a/8/main.l b/8/main.l new file mode 100644 index 0000000..3db9d6d --- /dev/null +++ b/8/main.l @@ -0,0 +1,15 @@ +%{ +#include "y.tab.h" +extern int yylval; +%} + +%% +a return A; +b return B; +. return yytext[0]; +\n return 0; +%% + +int yywrap() { + return 1; +} diff --git a/8/main.y b/8/main.y new file mode 100644 index 0000000..04e98a7 --- /dev/null +++ b/8/main.y @@ -0,0 +1,28 @@ +%{ +#include +#include +int yyerror(char *); +%} + +%token A B +%start S + +%% + +S: C B + | + ; +C: A C + | A A A A + ; +%% + +int main() { + yyparse(); + printf("valid string"); +} + +int yyerror(char *s) { + printf("error: %s", s); + exit(0); +} diff --git a/9/input b/9/input new file mode 100644 index 0000000..01efb5e --- /dev/null +++ b/9/input @@ -0,0 +1 @@ +aaabbbbc diff --git a/9/main.l b/9/main.l new file mode 100644 index 0000000..04c6bf0 --- /dev/null +++ b/9/main.l @@ -0,0 +1,16 @@ +%{ +#include "y.tab.h" +extern int yylval; +%} + +%% +a return A; +b return B; +c return C; +. return yytext[0]; +\n return 0; +%% + +int yywrap() { + return 1; +} diff --git a/9/main.y b/9/main.y new file mode 100644 index 0000000..0db29c1 --- /dev/null +++ b/9/main.y @@ -0,0 +1,30 @@ +%{ +#include +#include +int yylex(); +int yyerror(char *); +%} + +%token A B C + +%% +S: X Y + | + ; +X: A X B + | + ; +Y: B Y C + | + ; +%% + +int main() { + yyparse(); + printf("valid string"); +} + +int yyerror(char *s) { + printf("error: %s", s); + exit(0); +} diff --git a/flake.nix b/flake.nix index c85db6e..2e717b8 100644 --- a/flake.nix +++ b/flake.nix @@ -8,23 +8,67 @@ let pkgs = nixpkgs.legacyPackages."${system}"; nativeBuildInputs = with pkgs; [ + gcc flex bison ]; + defs = [ + { name = "1"; yacc = false; } + { name = "2"; yacc = false; } + { name = "3"; yacc = false; } + { name = "4"; yacc = false; } + { name = "5"; yacc = false; } + { name = "6"; yacc = true; } + { name = "7"; yacc = true; } + { name = "8"; yacc = true; } + ]; + apps = builtins.listToAttrs (builtins.map + (def: + let + builder = pkgs.stdenv.mkDerivation { + name = "${def.name}-v0.1.0"; + src = ./.; + buildInputs = nativeBuildInputs; + unpackCmd = '' + cp -r $src/${def.name} . + ''; + buildPhase = '' + flex -o ${def.name}.yy.cc main.l + if [[ ${pkgs.lib.trivial.boolToString def.yacc} = true ]]; then + yacc -d main.y + gcc -o exec y* ${def.name}.yy.cc + else + gcc -o exec ${def.name}.yy.cc + fi + ''; + installPhase = '' + mkdir -p $out/bin + install -m 755 -D exec -t $out/bin/ + ''; + }; + in + { + name = def.name; + value = { + type = "app"; + program = "${builder}/bin/exec"; + }; + }) + defs); + # buildYacc = pkgs.writeScriptBin "build-yacc" + # '' + # set -e + # prog_name="$1" + # outdir="outputs/$prog_name" + # mkdir -p "$outdir" - buildScript = pkgs.writeScriptBin "build-script" - '' - set -e - prog_name="$1" - outdir="outputs/$prog_name" - mkdir -p "$outdir" - - ${pkgs.flex}/bin/flex -o "$outdir"/lex.yy.cc "$prog_name"/main.l - ${pkgs.gcc}/bin/gcc "$outdir"/lex.yy.cc -o "$outdir"/exec + # ${pkgs.flex}/bin/flex -o "$outdir"/lex.yy.cc "$prog_name"/main.l + # ${pkgs.bison}/bin/yacc -b "$outdir"/y -d "$prog_name"/main.y + # ${pkgs.gcc}/bin/gcc -o "$outdir"/exec "$outdir"/y.* - ./"$outdir"/exec < "$prog_name"/input - rm -r outputs - ''; + # ./"$outdir"/exec < "$prog_name"/input + # rm -r outputs + # ''; in rec { @@ -33,9 +77,6 @@ gcc ]); }; - defaultApp = { - type = "app"; - program = "${buildScript}/bin/build-script"; - }; + inherit apps; }); } -- cgit v1.2.3