1*fece18c5SMasatake YAMATO# 2*fece18c5SMasatake YAMATO# yacc.ctags --- multitable regex parser for yacc/bison input 3*fece18c5SMasatake YAMATO# 4*fece18c5SMasatake YAMATO# Copyright (c) 2001-2002, Nick Hibma <n_hibma@van-laarhoven.org> 5*fece18c5SMasatake YAMATO# Copyright (c) 2021, Red Hat, Inc. 6*fece18c5SMasatake YAMATO# Copyright (c) 2021, Masatake YAMATO 7*fece18c5SMasatake YAMATO# 8*fece18c5SMasatake YAMATO# Author: Masatake YAMATO <yamato@redhat.com> 9*fece18c5SMasatake YAMATO# 10*fece18c5SMasatake YAMATO# This program is free software; you can redistribute it and/or 11*fece18c5SMasatake YAMATO# modify it under the terms of the GNU General Public License 12*fece18c5SMasatake YAMATO# as published by the Free Software Foundation; either version 2 13*fece18c5SMasatake YAMATO# of the License, or (at your option) any later version. 14*fece18c5SMasatake YAMATO# 15*fece18c5SMasatake YAMATO# This program is distributed in the hope that it will be useful, 16*fece18c5SMasatake YAMATO# but WITHOUT ANY WARRANTY; without even the implied warranty of 17*fece18c5SMasatake YAMATO# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*fece18c5SMasatake YAMATO# GNU General Public License for more details. 19*fece18c5SMasatake YAMATO# 20*fece18c5SMasatake YAMATO# You should have received a copy of the GNU General Public License 21*fece18c5SMasatake YAMATO# along with this program; if not, write to the Free Software 22*fece18c5SMasatake YAMATO# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 23*fece18c5SMasatake YAMATO# USA. 24*fece18c5SMasatake YAMATO# 25*fece18c5SMasatake YAMATO# The original version of this parser is written in C (+ regex patterns). 26*fece18c5SMasatake YAMATO# 27*fece18c5SMasatake YAMATO# References: 28*fece18c5SMasatake YAMATO# 29*fece18c5SMasatake YAMATO# - https://www.gnu.org/software/bison/manual/html_node/Grammar-File.html 30*fece18c5SMasatake YAMATO# 31*fece18c5SMasatake YAMATO 32*fece18c5SMasatake YAMATO--langdef=YACC 33*fece18c5SMasatake YAMATO--map-YACC=+.y 34*fece18c5SMasatake YAMATO 35*fece18c5SMasatake YAMATO# 36*fece18c5SMasatake YAMATO# Kind definitions 37*fece18c5SMasatake YAMATO# 38*fece18c5SMasatake YAMATO 39*fece18c5SMasatake YAMATO--kinddef-YACC=t,token,tokens 40*fece18c5SMasatake YAMATO--kinddef-YACC=l,label,labels 41*fece18c5SMasatake YAMATO 42*fece18c5SMasatake YAMATO# 43*fece18c5SMasatake YAMATO# 44*fece18c5SMasatake YAMATO# 45*fece18c5SMasatake YAMATO--_prelude-YACC={{ 46*fece18c5SMasatake YAMATO /token-type false def 47*fece18c5SMasatake YAMATO /type-dict 57 dict def 48*fece18c5SMasatake YAMATO}} 49*fece18c5SMasatake YAMATO 50*fece18c5SMasatake YAMATO# 51*fece18c5SMasatake YAMATO# Tables declaration 52*fece18c5SMasatake YAMATO# 53*fece18c5SMasatake YAMATO 54*fece18c5SMasatake YAMATO--_tabledef-YACC=toplevel 55*fece18c5SMasatake YAMATO--_tabledef-YACC=comment 56*fece18c5SMasatake YAMATO--_tabledef-YACC=cPrologue 57*fece18c5SMasatake YAMATO--_tabledef-YACC=grammar 58*fece18c5SMasatake YAMATO--_tabledef-YACC=cEpilogue 59*fece18c5SMasatake YAMATO--_tabledef-YACC=token 60*fece18c5SMasatake YAMATO--_tabledef-YACC=cUnion 61*fece18c5SMasatake YAMATO--_tabledef-YACC=cString 62*fece18c5SMasatake YAMATO--_tabledef-YACC=iString 63*fece18c5SMasatake YAMATO--_tabledef-YACC=rule 64*fece18c5SMasatake YAMATO--_tabledef-YACC=cActionCommon 65*fece18c5SMasatake YAMATO--_tabledef-YACC=cAction 66*fece18c5SMasatake YAMATO--_tabledef-YACC=type 67*fece18c5SMasatake YAMATO--_tabledef-YACC=cCharlit 68*fece18c5SMasatake YAMATO 69*fece18c5SMasatake YAMATO# 70*fece18c5SMasatake YAMATO# Tables definitions 71*fece18c5SMasatake YAMATO# 72*fece18c5SMasatake YAMATO--_mtable-regex-YACC=comment/[^*]+// 73*fece18c5SMasatake YAMATO--_mtable-regex-YACC=comment/\*\///{tleave} 74*fece18c5SMasatake YAMATO--_mtable-regex-YACC=comment/.// 75*fece18c5SMasatake YAMATO 76*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cPrologue/[^%]+// 77*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cPrologue/%\}//{tleave}{_guest=,,0start} 78*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cPrologue/.// 79*fece18c5SMasatake YAMATO 80*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cActionCommon/[^"\/\{\}]+// 81*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cActionCommon/"//{tenter=cString} 82*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cActionCommon/'//{tenter=cCharlit} 83*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cActionCommon/\/\*//{tenter=comment} 84*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cActionCommon/\{//{tenter=cAction} 85*fece18c5SMasatake YAMATO 86*fece18c5SMasatake YAMATO--_mtable-extend-YACC=cAction+cActionCommon 87*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cAction/\}//{tleave} 88*fece18c5SMasatake YAMATO 89*fece18c5SMasatake YAMATO--_mtable-regex-YACC=rule/[^\{;]+// 90*fece18c5SMasatake YAMATO--_mtable-regex-YACC=rule/\{//{tenter=cAction} 91*fece18c5SMasatake YAMATO--_mtable-regex-YACC=rule/;//{tleave} 92*fece18c5SMasatake YAMATO--_mtable-regex-YACC=rule/.// 93*fece18c5SMasatake YAMATO 94*fece18c5SMasatake YAMATO--_mtable-regex-YACC=grammar/%%//{tjump=cEpilogue}{_guest=C,0end,} 95*fece18c5SMasatake YAMATO--_mtable-regex-YACC=grammar/([a-zA-Z_.][-a-zA-Z_.0-9]+)[ \t\n]*:[ \t\n]*/\1/l/{tenter=rule}{{ 96*fece18c5SMasatake YAMATO type-dict \1 known { 97*fece18c5SMasatake YAMATO type-dict \1 get . exch typeref: 98*fece18c5SMasatake YAMATO } if 99*fece18c5SMasatake YAMATO}} 100*fece18c5SMasatake YAMATO--_mtable-regex-YACC=grammar/.// 101*fece18c5SMasatake YAMATO 102*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cEpilogue/.+//{_guest=,,0end} 103*fece18c5SMasatake YAMATO 104*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cString/[\\"]+// 105*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cString/\\.// 106*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cString/"//{tleave} 107*fece18c5SMasatake YAMATO 108*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cCharlit/[^\\]'//{tleave} 109*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cCharlit/\\.'//{tleave} 110*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cCharlit/'//{tleave} 111*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cCharlit/.// 112*fece18c5SMasatake YAMATO 113*fece18c5SMasatake YAMATO--_mtable-regex-YACC=iString/"//{tenter=cString} 114*fece18c5SMasatake YAMATO--_mtable-regex-YACC=iString/\)//{tleave} 115*fece18c5SMasatake YAMATO--_mtable-regex-YACC=iString/.// 116*fece18c5SMasatake YAMATO 117*fece18c5SMasatake YAMATO# 118*fece18c5SMasatake YAMATO# %token TAG? ( ID NUMBER? STRING? )+ ( TAG ( ID NUMBER? STRING? )+ )* 119*fece18c5SMasatake YAMATO# TODO: %left TAG? ( ID NUMBER?)+ ( TAG ( ID NUMBER? )+ )* 120*fece18c5SMasatake YAMATO# The directives %precedence, %right and %nonassoc behave like 121*fece18c5SMasatake YAMATO# %left. 122*fece18c5SMasatake YAMATO# 123*fece18c5SMasatake YAMATO--_mtable-regex-YACC=token/N?_[ \t]*\(//{tenter=iString} 124*fece18c5SMasatake YAMATO--_mtable-regex-YACC=token/([_a-zA-Z][_a-zA-Z0-9]*)[ \t\n]*/\1/t/{{ 125*fece18c5SMasatake YAMATO token-type false ne { 126*fece18c5SMasatake YAMATO . token-type typeref: 127*fece18c5SMasatake YAMATO } if 128*fece18c5SMasatake YAMATO}} 129*fece18c5SMasatake YAMATO# TODO condense multiple whitespaces in type name 130*fece18c5SMasatake YAMATO--_mtable-regex-YACC=token/<[ \t]*([_a-zA-Z][_a-zA-Z0-9 *]*)[ \t]*>[ \t\n]*//{{ 131*fece18c5SMasatake YAMATO /token-type \1 def 132*fece18c5SMasatake YAMATO}} 133*fece18c5SMasatake YAMATO--_mtable-regex-YACC=token/"//{tenter=cString} 134*fece18c5SMasatake YAMATO--_mtable-regex-YACC=token/'//{tenter=cCharlit} 135*fece18c5SMasatake YAMATO--_mtable-regex-YACC=token/-?[ \t\n]*(0x)?[0-9]+[ \t\n]*// 136*fece18c5SMasatake YAMATO--_mtable-regex-YACC=token/%//{tleave}{_advanceTo=0start}{{ 137*fece18c5SMasatake YAMATO /token-type false def 138*fece18c5SMasatake YAMATO}} 139*fece18c5SMasatake YAMATO--_mtable-regex-YACC=token/.|\n// 140*fece18c5SMasatake YAMATO 141*fece18c5SMasatake YAMATO--_mtable-extend-YACC=cUnion+cActionCommon 142*fece18c5SMasatake YAMATO--_mtable-regex-YACC=cUnion/\}//{tleave}{_guest=,,0end}{tleave} 143*fece18c5SMasatake YAMATO 144*fece18c5SMasatake YAMATO# 145*fece18c5SMasatake YAMATO# %type TAG? ( ID | CHAR | STRING )+ ( TAG ( ID | CHAR | STRING )+ )* 146*fece18c5SMasatake YAMATO# %nterm TAG? ID+ ( TAG ID+ )* 147*fece18c5SMasatake YAMATO# 148*fece18c5SMasatake YAMATO--_mtable-regex-YACC=type/N?_[ \t]*\(//{tenter=iString} 149*fece18c5SMasatake YAMATO--_mtable-regex-YACC=type/([_a-zA-Z][_a-zA-Z0-9]*)[ \t\n]*//{{ 150*fece18c5SMasatake YAMATO token-type false ne { 151*fece18c5SMasatake YAMATO type-dict \1 token-type put 152*fece18c5SMasatake YAMATO } if 153*fece18c5SMasatake YAMATO}} 154*fece18c5SMasatake YAMATO--_mtable-regex-YACC=type/<[ \t]*([_a-zA-Z][_a-zA-Z0-9 *]*)[ \t]*>[ \t\n]*//{{ 155*fece18c5SMasatake YAMATO /token-type \1 def 156*fece18c5SMasatake YAMATO}} 157*fece18c5SMasatake YAMATO--_mtable-regex-YACC=type/"//{tenter=cString} 158*fece18c5SMasatake YAMATO--_mtable-regex-YACC=type/'//{tenter=cCharlit} 159*fece18c5SMasatake YAMATO--_mtable-regex-YACC=type/%//{tleave}{_advanceTo=0start}{{ 160*fece18c5SMasatake YAMATO /token-type false def 161*fece18c5SMasatake YAMATO}} 162*fece18c5SMasatake YAMATO--_mtable-regex-YACC=type/.|\n// 163*fece18c5SMasatake YAMATO 164*fece18c5SMasatake YAMATO--_mtable-regex-YACC=toplevel/\/\*//{tenter=comment} 165*fece18c5SMasatake YAMATO--_mtable-regex-YACC=toplevel/%token[ \t\n]+//{tenter=token}{{ 166*fece18c5SMasatake YAMATO /token-type false def 167*fece18c5SMasatake YAMATO}} 168*fece18c5SMasatake YAMATO--_mtable-regex-YACC=toplevel/%(union)[^\{]*\{//{tenter=cUnion}{_guest=C,1start,} 169*fece18c5SMasatake YAMATO--_mtable-regex-YACC=toplevel/%(code[^\{]*)?\{//{tenter=cPrologue}{_guest=C,0end,} 170*fece18c5SMasatake YAMATO--_mtable-regex-YACC=toplevel/%(type|nterm)[ \n\t]*//{tenter=type}{{ 171*fece18c5SMasatake YAMATO /token-type false def 172*fece18c5SMasatake YAMATO}} 173*fece18c5SMasatake YAMATO 174*fece18c5SMasatake YAMATO--_mtable-regex-YACC=toplevel/%%//{tjump=grammar} 175*fece18c5SMasatake YAMATO--_mtable-regex-YACC=toplevel/[^\n]*\n// 176*fece18c5SMasatake YAMATO 177*fece18c5SMasatake YAMATO# TODO: %initial-action skip? 178*fece18c5SMasatake YAMATO# 179*fece18c5SMasatake YAMATO# -- Directive: %defines DEFINES-FILE 180*fece18c5SMasatake YAMATO# Same as above, but save in the file DEFINES-FILE. 181*fece18c5SMasatake YAMATO# -- Directive: %language "LANGUAGE" 182*fece18c5SMasatake YAMATO# -- Directive: %output "FILE" 183*fece18c5SMasatake YAMATO# Generate the parser implementation in FILE. 184