[Cluster-devel] [PATCH 7/7] gfs2l: Improve grammar layout and path parsing
Andrew Price
anprice at redhat.com
Mon May 20 11:37:16 UTC 2013
This makes a path a lexical entity so we don't have to kludge from a
string in the parse stage. It also tidies up the grammar layout and
simplifies the indentation to make it easier to maintain.
Signed-off-by: Andrew Price <anprice at redhat.com>
---
gfs2/libgfs2/lexer.l | 5 ++
gfs2/libgfs2/parser.y | 196 +++++++++++++++++++++++++-------------------------
2 files changed, 103 insertions(+), 98 deletions(-)
diff --git a/gfs2/libgfs2/lexer.l b/gfs2/libgfs2/lexer.l
index 7fe1aba..04b3883 100644
--- a/gfs2/libgfs2/lexer.l
+++ b/gfs2/libgfs2/lexer.l
@@ -32,6 +32,7 @@ number ({decnumber}|{hexnumber})
offset \+{number}
id {letter}({letter}|{decdigit}|\.)*
string \'([^\']|\\\')*\'
+path \'\/([^\']|\\\')*\'
ccomment \/\/.*\n
shcomment \#.*\n
comment ({ccomment}|{shcomment})
@@ -69,6 +70,10 @@ get {
state {
P(STATE, AST_KW_STATE, yytext);
}
+{path} {
+ yytext[yyleng-1] = '\0';
+ P(PATH, AST_EX_PATH, yytext + 1);
+ }
{string} {
yytext[yyleng-1] = '\0';
P(STRING, AST_EX_STRING, yytext + 1);
diff --git a/gfs2/libgfs2/parser.y b/gfs2/libgfs2/parser.y
index d60c1af..521c5df 100644
--- a/gfs2/libgfs2/parser.y
+++ b/gfs2/libgfs2/parser.y
@@ -35,106 +35,106 @@ static int yyerror(struct lgfs2_lang_state *state, yyscan_t lexer, const char *e
%token TOK_GET
%token TOK_STATE
%token TOK_STRING
+%token TOK_PATH
%%
-script: statements {
- state->ls_ast_root = $1;
- state->ls_interp_curr = $1;
- }
- | statements TOK_SEMI {
- state->ls_ast_root = $1;
- state->ls_interp_curr = $1;
- }
-;
-statements: statements TOK_SEMI statement {
- state->ls_ast_tail->ast_left = $3;
- state->ls_ast_tail = $3;
- $$ = $1;
- }
- | statement {
- if (state->ls_ast_tail == NULL)
- state->ls_ast_tail = $1;
- $$ = $1;
- }
+script: statements {
+ state->ls_ast_root = $1;
+ state->ls_interp_curr = $1;
+ }
+ | statements TOK_SEMI {
+ state->ls_ast_root = $1;
+ state->ls_interp_curr = $1;
+ }
;
-
-statement: set_stmt { $$ = $1; }
- | get_stmt { $$ = $1; }
-;
-set_stmt: TOK_SET blockspec structspec {
- $1->ast_right = $2;
- $2->ast_right = $3;
- $$ = $1;
- }
- | TOK_SET blockspec typespec structspec {
- $1->ast_right = $2;
- $2->ast_right = $3;
- $3->ast_right = $4;
- $$ = $1;
- }
-;
-get_stmt: TOK_GET blockspec { $1->ast_right = $2; $$ = $1; }
- | TOK_GET blockspec TOK_STATE {
- $1->ast_right = $2;
- $2->ast_right = $3;
- $$ = $1;
- }
-;
-blockspec: offset { $$ = $1; }
- | address { $$ = $1; }
- | path { $$ = $1; }
- | block_literal { $$ = $1; }
- | subscript { $$ = $1; }
-;
-offset: blockspec TOK_OFFSET {
- $2->ast_left = $1;
- $$ = $2;
- }
-;
-typespec: identifier {
- $1->ast_type = AST_EX_TYPESPEC;
- $$ = $1;
- }
-;
-block_literal: identifier { $$ = $1; }
-;
-subscript: block_literal TOK_LBRACKET index TOK_RBRACKET {
- $4->ast_left = $1;
- $1->ast_left = $3;
- $$ = $4;
- }
-;
-index: number { $$ = $1; }
- | identifier { $$ = $1; }
-;
-address: number { $1->ast_type = AST_EX_ADDRESS; $$ = $1; }
-;
-path: string {
- if (*($1->ast_str) != '/') {
- fprintf(stderr, "Path doesn't begin with '/': %s\n", $1->ast_str);
- YYABORT;
- }
- $1->ast_type = AST_EX_PATH;
- $$ = $1;
- }
-;
-structspec: TOK_LBRACE fieldspecs TOK_RBRACE { $$ = $2; }
-structspec: TOK_LBRACE TOK_RBRACE { $$ = NULL; }
-;
-fieldspecs: fieldspecs TOK_COMMA fieldspec { $1->ast_left = $3; $$ = $1; }
- | fieldspec { $$ = $1; }
-;
-fieldspec: identifier TOK_COLON fieldvalue {
- $2->ast_right = $1;
- $1->ast_right = $3;
- $$ = $2;
- }
-;
-fieldvalue: number { $$ = $1; }
- | string { $$ = $1; }
-;
-number: TOK_NUMBER { $$ = $1; }
-string: TOK_STRING { $$ = $1; }
-identifier: TOK_ID { $$ = $1; }
+statements: statements TOK_SEMI statement {
+ state->ls_ast_tail->ast_left = $3;
+ state->ls_ast_tail = $3;
+ $$ = $1;
+ }
+ | statement {
+ if (state->ls_ast_tail == NULL)
+ state->ls_ast_tail = $1;
+ $$ = $1;
+ }
+;
+statement: set_stmt { $$ = $1;}
+ | get_stmt { $$ = $1; }
+;
+set_stmt: TOK_SET blockspec structspec {
+ $1->ast_right = $2;
+ $2->ast_right = $3;
+ $$ = $1;
+ }
+ | TOK_SET blockspec typespec structspec {
+ $1->ast_right = $2;
+ $2->ast_right = $3;
+ $3->ast_right = $4;
+ $$ = $1;
+ }
+;
+get_stmt: TOK_GET blockspec {
+ $1->ast_right = $2; $$ = $1;
+ }
+ | TOK_GET blockspec TOK_STATE {
+ $1->ast_right = $2;
+ $2->ast_right = $3;
+ $$ = $1;
+ }
+;
+blockspec: offset { $$ = $1; }
+ | address { $$ = $1; }
+ | path { $$ = $1; }
+ | block_literal { $$ = $1; }
+ | subscript { $$ = $1; }
+;
+offset: blockspec TOK_OFFSET {
+ $2->ast_left = $1;
+ $$ = $2;
+ }
+;
+typespec: identifier {
+ $1->ast_type = AST_EX_TYPESPEC;
+ $$ = $1;
+ }
+;
+block_literal: identifier { $$ = $1; }
+;
+subscript: block_literal TOK_LBRACKET index TOK_RBRACKET {
+ $4->ast_left = $1;
+ $1->ast_left = $3;
+ $$ = $4;
+ }
+;
+index: number { $$ = $1; }
+ | identifier { $$ = $1; }
+;
+address: number {
+ $1->ast_type = AST_EX_ADDRESS;
+ $$ = $1;
+ }
+;
+structspec: TOK_LBRACE fieldspecs TOK_RBRACE { $$ = $2; }
+ | TOK_LBRACE TOK_RBRACE { $$ = NULL; }
+;
+fieldspecs: fieldspecs TOK_COMMA fieldspec {
+ $1->ast_left = $3;
+ $$ = $1;
+ }
+ | fieldspec { $$ = $1; }
+;
+fieldspec: identifier TOK_COLON fieldvalue {
+ $2->ast_right = $1;
+ $1->ast_right = $3;
+ $$ = $2;
+ }
+;
+fieldvalue: number { $$ = $1; }
+ | string { $$ = $1; }
+;
+number: TOK_NUMBER { $$ = $1; }
+string: TOK_STRING { $$ = $1; }
+identifier: TOK_ID { $$ = $1; }
+path: TOK_PATH { $$ = $1; }
%%
/**
--
1.8.1.4
More information about the Cluster-devel
mailing list