]>
Commit | Line | Data |
---|---|---|
10b1662b BP |
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, /* = */ | |
a20c96c6 | 61 | LEX_T_EXCHANGE, /* <-> */ |
56091efe | 62 | LEX_T_DECREMENT, /* -- */ |
10b1662b BP |
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 | }; | |
363b5330 | 78 | const char *lex_format_to_string(enum lex_format); |
10b1662b BP |
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 | ||
3d611299 | 95 | void lex_token_format(const struct lex_token *, struct ds *); |
10b1662b BP |
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 *); | |
27912fdb | 110 | enum lex_type lexer_lookahead(const struct lexer *); |
10b1662b | 111 | bool lexer_match(struct lexer *, enum lex_type); |
27912fdb | 112 | bool lexer_match_id(struct lexer *, const char *id); |
558ec83d BP |
113 | bool lexer_is_int(const struct lexer *); |
114 | bool lexer_get_int(struct lexer *, int *value); | |
10b1662b BP |
115 | |
116 | #endif /* ovn/lex.h */ |