]>
git.proxmox.com Git - ovs.git/blob - ovn/lib/lex.h
2 * Copyright (c) 2015, 2016 Nicira, Inc.
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:
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 /* OVN lexical analyzer
21 * ====================
23 * This is a simple lexical analyzer (or tokenizer) for OVN match expressions
26 #include "openvswitch/meta-flow.h"
32 LEX_T_END
, /* end of input */
34 /* Tokens with auxiliary data. */
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_MACRO
, /* $NAME */
40 LEX_T_ERROR
, /* invalid input */
47 LEX_T_LSQUARE
, /* [ */
48 LEX_T_RSQUARE
, /* ] */
55 LEX_T_LOG_NOT
, /* ! */
56 LEX_T_LOG_AND
, /* && */
57 LEX_T_LOG_OR
, /* || */
58 LEX_T_ELLIPSIS
, /* .. */
60 LEX_T_SEMICOLON
, /* ; */
62 LEX_T_EXCHANGE
, /* <-> */
63 LEX_T_DECREMENT
, /* -- */
67 /* Subtype for LEX_T_INTEGER and LEX_T_MASKED_INTEGER tokens.
69 * These do not change the semantics of a token; instead, they determine the
70 * format used when a token is serialized back to a text form. That's
71 * important because 3232268289 is meaningless to a human whereas 192.168.128.1
72 * has some actual significance. */
80 const char *lex_format_to_string(enum lex_format
);
87 /* Meaningful for LEX_T_ID, LEX_T_STRING, LEX_T_ERROR, LEX_T_MACRO only.
88 * For these token types, 's' may point to 'buffer'; otherwise, it points
89 * to malloc()ed memory owned by the token.
91 * Must be NULL for other token types.
93 * For LEX_T_MACRO, 's' does not include the leading $. */
96 /* LEX_T_INTEGER, LEX_T_MASKED_INTEGER only. */
97 enum lex_format format
;
100 /* LEX_T_INTEGER, LEX_T_MASKED_INTEGER only. */
102 union mf_subvalue value
; /* LEX_T_INTEGER, LEX_T_MASKED_INTEGER. */
103 union mf_subvalue mask
; /* LEX_T_MASKED_INTEGER only. */
106 /* LEX_T_ID, LEX_T_STRING, LEX_T_ERROR, LEX_T_MACRO only. */
111 void lex_token_init(struct lex_token
*);
112 void lex_token_destroy(struct lex_token
*);
113 void lex_token_swap(struct lex_token
*, struct lex_token
*);
114 void lex_token_strcpy(struct lex_token
*, const char *s
, size_t length
);
115 void lex_token_strset(struct lex_token
*, char *s
);
116 void lex_token_vsprintf(struct lex_token
*, const char *format
, va_list args
);
118 void lex_token_format(const struct lex_token
*, struct ds
*);
119 const char *lex_token_parse(struct lex_token
*, const char *input
,
120 const char **startp
);
122 /* A lexical analyzer. */
124 const char *input
; /* Remaining input (not owned by lexer). */
125 const char *start
; /* Start of current token in 'input'. */
126 struct lex_token token
; /* Current token (owned by lexer). */
129 void lexer_init(struct lexer
*, const char *input
);
130 void lexer_destroy(struct lexer
*);
132 enum lex_type
lexer_get(struct lexer
*);
133 enum lex_type
lexer_lookahead(const struct lexer
*);
134 bool lexer_match(struct lexer
*, enum lex_type
);
135 bool lexer_match_id(struct lexer
*, const char *id
);
136 bool lexer_is_int(const struct lexer
*);
137 bool lexer_get_int(struct lexer
*, int *value
);
139 #endif /* ovn/lex.h */