]> git.proxmox.com Git - ovs.git/blame - ovn/lib/lex.h
actions: Factor out new helper function add_prerequisite().
[ovs.git] / ovn / lib / lex.h
CommitLineData
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
28struct ds;
29
30/* Token type. */
31enum 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. */
71enum lex_format {
72 LEX_F_DECIMAL,
73 LEX_F_HEXADECIMAL,
74 LEX_F_IPV4,
75 LEX_F_IPV6,
76 LEX_F_ETHERNET,
77};
363b5330 78const char *lex_format_to_string(enum lex_format);
10b1662b
BP
79
80/* A token.
81 *
82 * 's' is owned by the token. */
83struct 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
91void lex_token_init(struct lex_token *);
92void lex_token_destroy(struct lex_token *);
93void lex_token_swap(struct lex_token *, struct lex_token *);
94
3d611299 95void lex_token_format(const struct lex_token *, struct ds *);
10b1662b
BP
96const char *lex_token_parse(struct lex_token *, const char *input,
97 const char **startp);
98
99/* A lexical analyzer. */
100struct 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
106void lexer_init(struct lexer *, const char *input);
107void lexer_destroy(struct lexer *);
108
109enum lex_type lexer_get(struct lexer *);
27912fdb 110enum lex_type lexer_lookahead(const struct lexer *);
10b1662b 111bool lexer_match(struct lexer *, enum lex_type);
27912fdb 112bool lexer_match_id(struct lexer *, const char *id);
558ec83d
BP
113bool lexer_is_int(const struct lexer *);
114bool lexer_get_int(struct lexer *, int *value);
10b1662b
BP
115
116#endif /* ovn/lex.h */