⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vparselex.l

📁 Verilog Parser in Perl
💻 L
📖 第 1 页 / 共 3 页
字号:
%option align interactive%option stack%option noc++%option prefix="VParseLex"%{/****************************************************************************** * DESCRIPTION: Verilog Parser Lexer * * This file is part of Verilog-Perl. * * Author: Wilson Snyder <wsnyder@wsnyder.org> * * Code available from: http://www.veripool.org/systemperl * ****************************************************************************** * * Copyright 2000-2009 by Wilson Snyder.  This program is free software; * you can redistribute it and/or modify it under the terms of either the GNU * Lesser General Public License or the Perl Artistic License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * ***************************************************************************** * Do not use Flex in C++ mode.  It has bugs with yyunput() which result in * lost characters. *****************************************************************************/#include "VParseLex.h"#include <cstdio>#include <iostream>#include <cstdarg>#include <cstring>#include "VParseGrammar.h"#include "VParseBison.h"#define YY_SKIP_YYWRAPVParseLex* VParseLex::s_currentLexp = NULL;	// Current lexing pointVParseBisonYYSType* VParseLex::s_yylvalp = NULL;		// LValue for current bison object#define LEXP (VParseLex::s_currentLexp)#define LPARSEP (LEXP->m_parsep)#define NEXTLINE()  { LPARSEP->inFilelineInc(); }#define FL { VParseLex::s_yylvalp->fl = LPARSEP->inFilelinep(); }// lval.fileline not used yet; here for Verilator parser compatibility#define VALTEXTS(strg) VParseLex::s_yylvalp->str = strg#define VALTEXT   VALTEXTS(string(yytext,yyleng))#define CALLBACKS(whichCb,strg) {LPARSEP->whichCb(VParseLex::s_yylvalp->fl, strg); }#define CALLBACK(whichCb) CALLBACKS(whichCb,string(yytext,yyleng))#define YY_INPUT(buf,result,max_size) \    result = LPARSEP->inputToLex(buf,max_size);int yywrap() { return LPARSEP->eofToLex(); }#define StashPrefix LPARSEP->unreadbackCat(yytext,yyleng)void yyerror(char* errmsg) {    LPARSEP->inFilelinep()->error(errmsg);}void yyerrorf(const char* format, ...) {    char msg[1024];    va_list ap;    va_start(ap,format);    vsprintf(msg,format,ap);    va_end(ap);    yyerror(msg);}/**********************************************************************/%}%s V95 V01 V05 S05%s STRING CMTMODE PROTMODE ATTRMODEspace	[ ]ws	[ \t\f\r]+	/* identifier */id	[a-zA-Z_][a-zA-Z0-9_$]*	/* escaped identifier */escid	\\[^ \t\f\r\n]+%%<INITIAL>.|\n 		{BEGIN S05; yyless(0); }  /* Verilog 1995 */<V95,V01,V05,S05>{  {ws}			{ StashPrefix; }	/* otherwise ignore white-space */  \n			{ StashPrefix; NEXTLINE();}		/* Count line numbers */  /*     Keywords */  "always"		{ FL; VALTEXT; CALLBACK(keywordCb); return yALWAYS; }  "and"			{ FL; VALTEXT; CALLBACK(keywordCb); return yAND; }  "assign"		{ FL; VALTEXT; CALLBACK(keywordCb); return yASSIGN; }  "begin"		{ FL; VALTEXT; CALLBACK(keywordCb); return yBEGIN; }  "buf"			{ FL; VALTEXT; CALLBACK(keywordCb); return yBUF; }  "case"		{ FL; VALTEXT; CALLBACK(keywordCb); return yCASE; }  "casex"		{ FL; VALTEXT; CALLBACK(keywordCb); return yCASEX; }  "casez"		{ FL; VALTEXT; CALLBACK(keywordCb); return yCASEZ; }  "deassign"		{ FL; VALTEXT; CALLBACK(keywordCb); return yDEASSIGN; }  "default"		{ FL; VALTEXT; CALLBACK(keywordCb); return yDEFAULT; }  "defparam"		{ FL; VALTEXT; CALLBACK(keywordCb); return yDEFPARAM; }  "disable"		{ FL; VALTEXT; CALLBACK(keywordCb); return yDISABLE; }  "edge"		{ FL; VALTEXT; CALLBACK(keywordCb); return yaTIMINGSPEC; }  "else"		{ FL; VALTEXT; CALLBACK(keywordCb); return yELSE; }  "end"			{ FL; VALTEXT; CALLBACK(keywordCb); return yEND; }  "endcase"		{ FL; VALTEXT; CALLBACK(keywordCb); return yENDCASE; }  "endfunction"		{ FL; VALTEXT; CALLBACK(keywordCb); return yENDFUNCTION; }  "endmodule"		{ FL; VALTEXT; CALLBACK(keywordCb); return yENDMODULE; }  "endprimitive"	{ FL; VALTEXT; CALLBACK(keywordCb); return yENDMODULE; }  "endspecify"		{ FL; VALTEXT; CALLBACK(keywordCb); return yENDSPECIFY; }  "endtable"		{ FL; VALTEXT; CALLBACK(keywordCb); return yENDTABLE; }  "endtask"		{ FL; VALTEXT; CALLBACK(keywordCb); return yENDTASK; }  "event"		{ FL; VALTEXT; CALLBACK(keywordCb); return yEVENT; }  "for"			{ FL; VALTEXT; CALLBACK(keywordCb); return yFOR; }  "force"		{ FL; VALTEXT; CALLBACK(keywordCb); return yFORCE; }  "forever"		{ FL; VALTEXT; CALLBACK(keywordCb); return yFOREVER; }  "fork"		{ FL; VALTEXT; CALLBACK(keywordCb); return yFORK; }  "function"		{ FL; VALTEXT; CALLBACK(keywordCb); return yFUNCTION; }  "if"			{ FL; VALTEXT; CALLBACK(keywordCb); return yIF; }  "initial"		{ FL; VALTEXT; CALLBACK(keywordCb); return yINITIAL; }  "inout"		{ FL; VALTEXT; CALLBACK(keywordCb); return yINOUT; }  "input"		{ FL; VALTEXT; CALLBACK(keywordCb); return yINPUT; }  "integer"		{ FL; VALTEXT; CALLBACK(keywordCb); return yINTEGER; }  "join"		{ FL; VALTEXT; CALLBACK(keywordCb); return yJOIN; }  "macromodule"		{ FL; VALTEXT; CALLBACK(keywordCb); return yMODULE; }  "module"		{ FL; VALTEXT; CALLBACK(keywordCb); return yMODULE; }  "nand"		{ FL; VALTEXT; CALLBACK(keywordCb); return yNAND; }  "negedge"		{ FL; VALTEXT; CALLBACK(keywordCb); return yNEGEDGE; }  "nor"			{ FL; VALTEXT; CALLBACK(keywordCb); return yNOR; }  "not"			{ FL; VALTEXT; CALLBACK(keywordCb); return yNOT; }  "or"			{ FL; VALTEXT; CALLBACK(keywordCb); return yOR; }  "output"		{ FL; VALTEXT; CALLBACK(keywordCb); return yOUTPUT; }  "parameter"		{ FL; VALTEXT; CALLBACK(keywordCb); return yPARAMETER; }  "posedge"		{ FL; VALTEXT; CALLBACK(keywordCb); return yPOSEDGE; }  "primitive"		{ FL; VALTEXT; CALLBACK(keywordCb); return yMODULE; }  "real"		{ FL; VALTEXT; CALLBACK(keywordCb); return yREAL; }  "realtime"		{ FL; VALTEXT; CALLBACK(keywordCb); return yREALTIME; }  "reg"			{ FL; VALTEXT; CALLBACK(keywordCb); return yREG; }  "release"		{ FL; VALTEXT; CALLBACK(keywordCb); return yRELEASE; }  "repeat"		{ FL; VALTEXT; CALLBACK(keywordCb); return yREPEAT; }  "scalared"		{ FL; VALTEXT; CALLBACK(keywordCb); return ySCALARED; }  "specify"		{ FL; VALTEXT; CALLBACK(keywordCb); return ySPECIFY; }  "specparam"		{ FL; VALTEXT; CALLBACK(keywordCb); return ySPECPARAM; }  "supply0"		{ FL; VALTEXT; CALLBACK(keywordCb); return ySUPPLY0; }  "supply1"		{ FL; VALTEXT; CALLBACK(keywordCb); return ySUPPLY1; }  "table"		{ FL; VALTEXT; CALLBACK(keywordCb); return yTABLE; }  "task"		{ FL; VALTEXT; CALLBACK(keywordCb); return yTASK; }  "time"		{ FL; VALTEXT; CALLBACK(keywordCb); return yTIME; }  "tri"			{ FL; VALTEXT; CALLBACK(keywordCb); return yTRI; }  "vectored"		{ FL; VALTEXT; CALLBACK(keywordCb); return yVECTORED; }  "wait"		{ FL; VALTEXT; CALLBACK(keywordCb); return yWAIT; }  "while"		{ FL; VALTEXT; CALLBACK(keywordCb); return yWHILE; }  "wire"		{ FL; VALTEXT; CALLBACK(keywordCb); return yWIRE; }  "xnor"		{ FL; VALTEXT; CALLBACK(keywordCb); return yXNOR; }  "xor"			{ FL; VALTEXT; CALLBACK(keywordCb); return yXOR; }  /*     Types Verilator doesn't support but we do generically here */  "bufif0"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "bufif1"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "cmos"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "highz0"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenSTRENGTH; }  "highz1"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenSTRENGTH; }  "large"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenSTRENGTH; }  "medium"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenSTRENGTH; }  "nmos"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "notif0"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "notif1"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "pmos"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "pull0"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenSTRENGTH; }  "pull1"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenSTRENGTH; }  "pulldown"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "pullup"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "rcmos"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "rnmos"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "rpmos"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "rtran"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "rtranif0"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "rtranif1"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "small"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenSTRENGTH; }  "strong0"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenSTRENGTH; }  "strong1"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenSTRENGTH; }  "tran"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "tranif0"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "tranif1"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenGATE; }  "tri0"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenNETTYPE; }  "tri1"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenNETTYPE; }  "triand"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenNETTYPE; }  "trior"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenNETTYPE; }  "trireg"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenNETTYPE; }  "wand"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenNETTYPE; }  "weak0"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenSTRENGTH; }  "weak1"		{ FL; VALTEXT; CALLBACK(keywordCb); return ygenSTRENGTH; }  "wor"			{ FL; VALTEXT; CALLBACK(keywordCb); return ygenNETTYPE; }  /*     Generic unsupported warnings */}  /* Verilog 2001 */<V01,V05,S05>{  /*     Keywords*/  "automatic"		{ FL; VALTEXT; CALLBACK(keywordCb); return yAUTOMATIC; }  "endgenerate"		{ FL; VALTEXT; CALLBACK(keywordCb); return yENDGENERATE; }  "generate"		{ FL; VALTEXT; CALLBACK(keywordCb); return yGENERATE; }  "genvar"		{ FL; VALTEXT; CALLBACK(keywordCb); return yGENVAR; }  "ifnone"		{ FL; VALTEXT; CALLBACK(keywordCb); return yaTIMINGSPEC; }  "localparam"		{ FL; VALTEXT; CALLBACK(keywordCb); return yLOCALPARAM; }  "noshowcancelled"	{ FL; VALTEXT; CALLBACK(keywordCb); return yaTIMINGSPEC; }  "pulsestyle_ondetect"	{ FL; VALTEXT; CALLBACK(keywordCb); return yaTIMINGSPEC; }  "pulsestyle_onevent"	{ FL; VALTEXT; CALLBACK(keywordCb); return yaTIMINGSPEC; }  "showcancelled"	{ FL; VALTEXT; CALLBACK(keywordCb); return yaTIMINGSPEC; }  "signed"		{ FL; VALTEXT; CALLBACK(keywordCb); return ySIGNED; }  "unsigned"		{ FL; VALTEXT; CALLBACK(keywordCb); return yUNSIGNED; }  /*     Generic unsupported keywords */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -