12c7b1c5 (kx 2023-03-24 02:53:04 +0300 1)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 2) %{
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 3)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 4) #ifdef HAVE_CONFIG_H
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 5) #include <config.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 6) #endif
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 7)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 8) #include <stdlib.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 9) #include <stdio.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 10) #include <unistd.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 11) #include <string.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 12) #include <stdarg.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 13) #include <limits.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 14) #include <locale.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 15) #include <wchar.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 16) #include <wctype.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 17)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 18) #include <defs.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 19)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 20) #include <main.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 21) #include <error.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 22) #include <msglog.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 23) #include <xalloc.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 24) #include <utf8ing.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 25) #include <symtab.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 26) #include <parse.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 27) #include <lex.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 28)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 29)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 30) %}
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 31)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 32)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 33) %union
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 34) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 35) SYMBOL *sym;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 36) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 37)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 38) %token <sym> VARIABLE 501 SECTION 502 REPO 503
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 39) %token <sym> NUMERICAL 510 STRING 511 PATH 512
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 40) %right '='
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 41) %left UNARYMINUS
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 42) /************************************************************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 43) Following tokens declared only for verbose error messaging
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 44) to prevent "$undefined" values of unexpected symbols:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 45) */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 46) %token '!' '"' '#' '$' '%' '&' '\'' '(' ')' '*' '/' '+' '-'
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 47) %token '.' ',' ':' '<' '>' '?' '@' '[' '\\' ']' '^' '`'
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 48)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 49) %start list
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 50)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 51) %%
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 52) list: /* nothing */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 53) | list ';'
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 54) | list repo
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 55) | list section
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 56) | list assign ';'
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 57) | list error ';' { return 1; }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 58) ;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 59)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 60) assign: VARIABLE '=' NUMERICAL { (void)assign_value( $1, $3 ); }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 61) | VARIABLE '=' '+' NUMERICAL { (void)assign_value( $1, $4 ); }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 62) | VARIABLE '=' '-' NUMERICAL %prec UNARYMINUS { $4->u.value = -$4->u.value; (void)assign_value( $1, $4 ); }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 63) | VARIABLE '=' STRING { (void)assign_value( $1, $3 ); }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 64) | VARIABLE '=' PATH { (void)assign_value( $1, $3 ); }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 65) | NUMERICAL '=' NUMERICAL { (void)assign_value( $1, $3 ); }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 66) | STRING '=' STRING { (void)assign_value( $1, $3 ); }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 67) | PATH '=' PATH { (void)assign_value( $1, $3 ); }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 68) ;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 69)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 70) alist: /* nothing */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 71) | alist ';'
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 72) | alist assign ';'
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 73) ;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 74)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 75) repo: REPO PATH '{'
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 76) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 77) if( lookup_repo( $2->u.path ) )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 78) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 79) error( "Repository '%s' is already defined", $2->u.path );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 80) return 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 81) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 82) (void)assign_value( $1, $2 ); push_symlist( (SYMBOL **)&($1->list) );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 83) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 84) alist
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 85) '}' { pop_symlist(); }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 86) ;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 87)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 88) rlist: /* nothing */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 89) | rlist repo
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 90) ;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 91)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 92) section:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 93) SECTION STRING '{'
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 94) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 95) if( lookup_section( $2->u.string ) )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 96) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 97) error( "Section '%s' is already defined", $2->u.string );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 98) return 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 99) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 100) (void)assign_value( $1, $2 ); push_symlist( (SYMBOL **)&($1->list) );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 101) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 102) rlist
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 103) '}' { pop_symlist(); }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 104) ;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 105)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 106) %%
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 107)