ovn-controller: race between binding-run and patch-run for localnet ports
[cascardo/ovs.git] / ovn / lib / lex.h
1 /*
2  * Copyright (c) 2015 Nicira, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef OVN_LEX_H
18 #define OVN_LEX_H 1
19
20 /* OVN lexical analyzer
21  * ====================
22  *
23  * This is a simple lexical analyzer (or tokenizer) for OVN match expressions
24  * and ACLs. */
25
26 #include "meta-flow.h"
27
28 struct ds;
29
30 /* Token type. */
31 enum lex_type {
32     LEX_T_END,                  /* end of input */
33
34     /* Tokens with auxiliary data. */
35     LEX_T_ID,                   /* foo */
36     LEX_T_STRING,               /* "foo" */
37     LEX_T_INTEGER,              /* 12345 or 1.2.3.4 or ::1 or 01:02:03:04:05 */
38     LEX_T_MASKED_INTEGER,       /* 12345/10 or 1.2.0.0/16 or ::2/127 or... */
39     LEX_T_ERROR,                /* invalid input */
40
41     /* Bare tokens. */
42     LEX_T_LPAREN,               /* ( */
43     LEX_T_RPAREN,               /* ) */
44     LEX_T_LCURLY,               /* { */
45     LEX_T_RCURLY,               /* } */
46     LEX_T_LSQUARE,              /* [ */
47     LEX_T_RSQUARE,              /* ] */
48     LEX_T_EQ,                   /* == */
49     LEX_T_NE,                   /* != */
50     LEX_T_LT,                   /* < */
51     LEX_T_LE,                   /* <= */
52     LEX_T_GT,                   /* > */
53     LEX_T_GE,                   /* >= */
54     LEX_T_LOG_NOT,              /* ! */
55     LEX_T_LOG_AND,              /* && */
56     LEX_T_LOG_OR,               /* || */
57     LEX_T_ELLIPSIS,             /* .. */
58     LEX_T_COMMA,                /* , */
59     LEX_T_SEMICOLON,            /* ; */
60     LEX_T_EQUALS,               /* = */
61     LEX_T_EXCHANGE,             /* <-> */
62     LEX_T_DECREMENT,            /* -- */
63 };
64
65 /* Subtype for LEX_T_INTEGER and LEX_T_MASKED_INTEGER tokens.
66  *
67  * These do not change the semantics of a token; instead, they determine the
68  * format used when a token is serialized back to a text form.  That's
69  * important because 3232268289 is meaningless to a human whereas 192.168.128.1
70  * has some actual significance. */
71 enum lex_format {
72     LEX_F_DECIMAL,
73     LEX_F_HEXADECIMAL,
74     LEX_F_IPV4,
75     LEX_F_IPV6,
76     LEX_F_ETHERNET,
77 };
78 const char *lex_format_to_string(enum lex_format);
79
80 /* A token.
81  *
82  * 's' is owned by the token. */
83 struct lex_token {
84     enum lex_type type;         /* One of LEX_*. */
85     char *s;                    /* LEX_T_ID, LEX_T_STRING, LEX_T_ERROR only. */
86     enum lex_format format;     /* LEX_T_INTEGER, LEX_T_MASKED_INTEGER only. */
87     union mf_subvalue value;    /* LEX_T_INTEGER, LEX_T_MASKED_INTEGER only. */
88     union mf_subvalue mask;     /* LEX_T_MASKED_INTEGER only. */
89 };
90
91 void lex_token_init(struct lex_token *);
92 void lex_token_destroy(struct lex_token *);
93 void lex_token_swap(struct lex_token *, struct lex_token *);
94
95 void lex_token_format(const struct lex_token *, struct ds *);
96 const char *lex_token_parse(struct lex_token *, const char *input,
97                             const char **startp);
98
99 /* A lexical analyzer. */
100 struct lexer {
101     const char *input;          /* Remaining input (not owned by lexer). */
102     const char *start;          /* Start of current token in 'input'. */
103     struct lex_token token;     /* Current token (owned by lexer). */
104 };
105
106 void lexer_init(struct lexer *, const char *input);
107 void lexer_destroy(struct lexer *);
108
109 enum lex_type lexer_get(struct lexer *);
110 enum lex_type lexer_lookahead(const struct lexer *);
111 bool lexer_match(struct lexer *, enum lex_type);
112 bool lexer_match_id(struct lexer *, const char *id);
113 bool lexer_is_int(const struct lexer *);
114 bool lexer_get_int(struct lexer *, int *value);
115
116 #endif /* ovn/lex.h */