📄 vparselex.l
字号:
%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 + -