aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/build.l77
-rw-r--r--src/build.y91
-rw-r--r--src/builder.cpp34
-rw-r--r--src/builder.h36
-rw-r--r--src/main.cpp9
5 files changed, 243 insertions, 4 deletions
diff --git a/src/build.l b/src/build.l
index 6daaa94..6a80f45 100644
--- a/src/build.l
+++ b/src/build.l
@@ -1,4 +1,20 @@
1 int lineNum = 1; 1%{
2# include <string>
3# include "builder.h"
4# include "build.tab.h"
5# include "stringrep.h"
6
7std::string strbuf;
8%}
9
10%x strsq
11%x strdq
12%x comment
13%option noyywrap nounput batch debug
14
15%{
16# define YY_USER_ACTION yylloc->columns (yyleng);
17%}
2%% 18%%
3 19
4[,:=] return yytext[0]; 20[,:=] return yytext[0];
@@ -23,9 +39,62 @@
23"produces" return TOK_PRODUCES; 39"produces" return TOK_PRODUCES;
24"command" return TOK_COMMAND; 40"command" return TOK_COMMAND;
25 41
42"..."\n /* elipsis line continuation */
26\n+ return TOX_EOL; 43\n+ return TOX_EOL;
27[ \t\r]* 44[ \t\r]* /* whitespace */
45
46\/\/.* /* single line comment */
47"#".* /* single line comment */
48
49[^ \t\r\n\'\"]+ {
50 yylval.strval = stringdup( yytext );
51 return STRING;
52}
53
54\" {
55 BEGIN( strdq );
56 strbuf = "";
57}
58\' {
59 BEGIN( strsq );
60 strbuf = "";
61}
62
63<strdq>[^\\\n\"]+ {
64 strbuf += yytext;
65}
66
67<strsq>[^\\\n\']+ {
68 strbuf += yytext;
69}
70
71<strdq,strsq>\\n strbuf += "\n";
72<strdq,strsq>\\t strbuf += "\t";
73<strdq,strsq>\\r strbuf += "\r";
74<strdq,strsq>\\b strbuf += "\b";
75<strdq,strsq>\\f strbuf += "\f";
76
77<strdq>\" {
78 BEGIN( INITIAL );
79 yylval->strval = stringdup( strbuf.c_str() );
80 return STRING;
81}
82
83<strsq>\' {
84 BEGIN( INITIAL );
85 yylval->strval = stringdup( strbuf.c_str() );
86 return STRING;
87}
88
89
90void Builder::scanBegin()
91{
92 if( !(yyin = fopen( file.c_str(), "r" )) )
93 error( std::string("cannot open ") + file );
94}
28 95
29\/\/.* 96void Builder::scanEnd()
30"#".* 97{
98 fclose( yyin );
99}
31 100
diff --git a/src/build.y b/src/build.y
index e69de29..600b923 100644
--- a/src/build.y
+++ b/src/build.y
@@ -0,0 +1,91 @@
1%skeleton "lalr1.cc"
2%define "parser_class_name" "BuildParser"
3%defines
4%{
5# include <string>
6# include "builder.h"
7# include "build.tab.h"
8%}
9
10%parse-param { Builder &bld }
11%lex-param { Builder &bld }
12
13%locations
14%initial-action
15{
16 @$.begin.filename = @$.end.filename = &bld.file;
17}
18
19%debug
20%error-verbose
21%union {
22 char *strval;
23}
24
25%token <strval> STRING "string literal"
26
27%token TOK_ADDSET "+="
28%token TOK_DEFAULT "keyword 'default'"
29%token TOK_ACTION "keyword 'action'"
30%token TOK_CREATE "keyword 'create'"
31%token TOK_FILE "keyword 'file'"
32%token TOK_FROM "keyword 'from'"
33%token TOK_FILES "keyword 'files'"
34%token TOK_IN "keyword 'in'"
35%token TOK_USING "keyword 'using'"
36%token TOK_RULE "keyword 'rule'"
37%token TOK_REQUIRES "keyword 'requires'"
38%token TOK_FOR "keyword 'for'"
39%token TOK_SET "keyword 'set'"
40%token TOK_MATCHES "keyword 'matches'"
41%token TOK_ALL "keyword 'all'"
42%token TOK_ONE "keyword 'one'"
43%token TOK_PERFORM "keyword 'perform'"
44%token TOK_PRODUCES "keyword 'produces'"
45%token TOK_COMMAND "keyword 'command'"
46%token TOK_EOL "end of line"
47
48%destructor { delete[] $$; } STRING
49
50%%
51
52input:
53 | input line
54 ;
55
56line: stuff TOK_EOL { printf("\n"); }
57 ;
58
59stuff:
60 | stuff token
61 ;
62
63token: TOK_ADDSET { printf("+= "); }
64 | TOK_DEFAULT { printf("default "); }
65 | TOK_ACTION { printf("action "); }
66 | TOK_CREATE { printf("create "); }
67 | TOK_FILE { printf("file "); }
68 | TOK_FROM { printf("from "); }
69 | TOK_FILES { printf("files "); }
70 | TOK_IN { printf("in "); }
71 | TOK_USING { printf("using "); }
72 | TOK_RULE { printf("rule "); }
73 | TOK_REQUIRES { printf("requires "); }
74 | TOK_FOR { printf("for "); }
75 | TOK_SET { printf("set "); }
76 | TOK_MATCHES { printf("matches "); }
77 | TOK_ALL { printf("all "); }
78 | TOK_ONE { printf("one "); }
79 | TOK_PERFORM { printf("perform "); }
80 | TOK_PRODUCES { printf("produces "); }
81 | TOK_COMMAND { printf("command "); }
82 ;
83
84%%
85
86void yy::BuildParser::error( const yy::BuildParser::location_type &l,
87 const std::string &m )
88{
89 bld.error( l, m );
90}
91
diff --git a/src/builder.cpp b/src/builder.cpp
new file mode 100644
index 0000000..8c72fef
--- /dev/null
+++ b/src/builder.cpp
@@ -0,0 +1,34 @@
1#include <iostream>
2
3#include "builder.h"
4#include "build.tab.h"
5
6Builder::Builder()
7{
8}
9
10Builder::~Builder()
11{
12}
13
14void Builder::load( const char *sFN )
15{
16 file = sFN;
17
18 scanBegin();
19 yy::BuildParser parser( *this );
20 parser.set_debug_level( false );
21 parser.parse();
22 scanEnd();
23}
24
25void Builder::error( const yy::location &l, const std::string &m )
26{
27 std::cerr << l << ": " << m << std::endl;
28}
29
30void Builder::error( const std::string &m )
31{
32 std::cerr << m << std::endl;
33}
34
diff --git a/src/builder.h b/src/builder.h
new file mode 100644
index 0000000..e379608
--- /dev/null
+++ b/src/builder.h
@@ -0,0 +1,36 @@
1#ifndef BUILDER_H
2#define BUILDER_H
3
4#include <string>
5
6union YYSTYPE;
7
8namespace yy
9{
10 class location;
11 class BuildParser;
12}
13class Builder;
14
15#define YY_DECL int yylex( YYSTYPE *yylval_param, yy::location *yylloc, Builder &bld )
16YY_DECL;
17
18class Builder
19{
20public:
21 Builder();
22 virtual ~Builder();
23
24 void load( const char *sFN );
25
26 void error( const yy::location &l, const std::string &m );
27 void error( const std::string &m );
28
29 std::string file;
30
31private:
32 void scanBegin();
33 void scanEnd();
34};
35
36#endif
diff --git a/src/main.cpp b/src/main.cpp
index e69de29..7e130bc 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -0,0 +1,9 @@
1#include "builder.h"
2
3int main()
4{
5 Builder bld;
6
7 bld.load("congo");
8}
9