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()47inline 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()62bool parse() 63 { 64 nextToken(); 65 return parseXmlStream(); 66 } 67 parseXmlStream()68bool parseXmlStream() 69 { 70 while (parseTagOrWord()) 71 ; 72 73 return true; 74 } 75 parseTagOrWord()76bool 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()96bool parseTagName() 97 { 98 while (yytoken == ANY) 99 nextToken(); 100 101 return true; 102 } 103 main()104int main() 105 { 106 if (parse()) 107 printf("OK\n"); 108 else 109 printf("KO\n"); 110 } 111