1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QLALR module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21 ** included in the packaging of this file. Please review the following
22 ** information to ensure the GNU General Public License requirements will
23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24 **
25 ** $QT_END_LICENSE$
26 **
27 ****************************************************************************/
28 
29 #include <cstdlib>
30 #include <cstdio>
31 
32 enum Token {
33     EOF_SYMBOL,
34     LEFT_ANGLE,
35     RIGHT_ANGLE,
36     ANY,
37 };
38 
39 static int current_char;
40 static int yytoken;
41 static bool in_tag = false;
42 
43 bool parseXmlStream();
44 bool parseTagOrWord();
45 bool parseTagName();
46 
nextToken()47 inline int nextToken()
48 {
49     current_char = fgetc(stdin);
50     if (current_char == EOF) {
51         return (yytoken = EOF_SYMBOL);
52     } else if (current_char == '<') {
53         in_tag = true;
54         return (yytoken = LEFT_ANGLE);
55     } else if (in_tag && current_char == '>') {
56         in_tag = false;
57         return (yytoken = RIGHT_ANGLE);
58     }
59     return (yytoken = ANY);
60 }
61 
parse()62 bool parse()
63 {
64     nextToken();
65     return parseXmlStream();
66 }
67 
parseXmlStream()68 bool parseXmlStream()
69 {
70     while (parseTagOrWord())
71         ;
72 
73     return true;
74 }
75 
parseTagOrWord()76 bool parseTagOrWord()
77 {
78     if (yytoken == LEFT_ANGLE) {
79         nextToken();
80         if (! parseTagName())
81             return false;
82         if (yytoken != RIGHT_ANGLE)
83             return false;
84         nextToken();
85 
86         fprintf (stderr, "*** found a tag\n");
87 
88     } else if (yytoken == ANY) {
89         nextToken();
90     } else {
91         return false;
92     }
93     return true;
94 }
95 
parseTagName()96 bool parseTagName()
97 {
98     while (yytoken == ANY)
99         nextToken();
100 
101     return true;
102 }
103 
main()104 int main()
105 {
106     if (parse())
107         printf("OK\n");
108     else
109         printf("KO\n");
110 }
111