cpp5.l
来自「用于lex和yacc的c++及c语言的文法,可用来构造C++语言的编译器」· L 代码 · 共 372 行 · 第 1/2 页
L
372 行
octal_escape [0-7]{1,3}
hex_escape "x"[0-9a-fA-F]+
escape_sequence [\\]({simple_escape}|{octal_escape}|{hex_escape})
c_char [^'\\\n]|{escape_sequence}
s_char [^"\\\n]|{escape_sequence}
h_tab [\011]
form_feed [\014]
v_tab [\013]
c_return [\015]
horizontal_white [ ]|{h_tab}
%%
{horizontal_white}+ {
WHITE_RETURN(' ');
}
({v_tab}|{c_return}|{form_feed})+ {
WHITE_RETURN(' ');
}
({horizontal_white}|{v_tab}|{c_return}|{form_feed})*"\n" {
NEW_LINE_RETURN();
}
auto {PA_KEYWORD_RETURN(AUTO);}
break {PA_KEYWORD_RETURN(BREAK);}
case {PA_KEYWORD_RETURN(CASE);}
char {PA_KEYWORD_RETURN(CHAR);}
const {PA_KEYWORD_RETURN(CONST);}
continue {PA_KEYWORD_RETURN(CONTINUE);}
default {PA_KEYWORD_RETURN(DEFAULT);}
define {PP_KEYWORD_RETURN(DEFINE);}
defined {PP_KEYWORD_RETURN(OPDEFINED);}
do {PA_KEYWORD_RETURN(DO);}
double {PA_KEYWORD_RETURN(DOUBLE);}
elif {PP_KEYWORD_RETURN(ELIF);}
else {PPPA_KEYWORD_RETURN(ELSE);}
endif {PP_KEYWORD_RETURN(ENDIF);}
enum {PA_KEYWORD_RETURN(ENUM);}
error {PP_KEYWORD_RETURN(ERROR);}
extern {PA_KEYWORD_RETURN(EXTERN);}
float {PA_KEYWORD_RETURN(FLOAT);}
for {PA_KEYWORD_RETURN(FOR);}
goto {PA_KEYWORD_RETURN(GOTO);}
if {PPPA_KEYWORD_RETURN(IF);}
ifdef {PP_KEYWORD_RETURN(IFDEF);}
ifndef {PP_KEYWORD_RETURN(IFNDEF);}
include {PP_KEYWORD_RETURN(INCLUDE); }
int {PA_KEYWORD_RETURN(INT);}
line {PP_KEYWORD_RETURN(LINE);}
long {PA_KEYWORD_RETURN(LONG);}
pragma {PP_KEYWORD_RETURN(PRAGMA);}
register {PA_KEYWORD_RETURN(REGISTER);}
return {PA_KEYWORD_RETURN(RETURN);}
short {PA_KEYWORD_RETURN(SHORT);}
signed {PA_KEYWORD_RETURN(SIGNED);}
sizeof {PA_KEYWORD_RETURN(SIZEOF);}
static {PA_KEYWORD_RETURN(STATIC);}
struct {PA_KEYWORD_RETURN(STRUCT);}
switch {PA_KEYWORD_RETURN(SWITCH);}
typedef {PA_KEYWORD_RETURN(TYPEDEF);}
undef {PP_KEYWORD_RETURN(UNDEF);}
union {PA_KEYWORD_RETURN(UNION);}
unsigned {PA_KEYWORD_RETURN(UNSIGNED);}
void {PA_KEYWORD_RETURN(VOID);}
volatile {PA_KEYWORD_RETURN(VOLATILE);}
while {PA_KEYWORD_RETURN(WHILE);}
class {CPP_KEYWORD_RETURN(CLASS);}
delete {CPP_KEYWORD_RETURN(DELETE);}
friend {CPP_KEYWORD_RETURN(FRIEND);}
inline {CPP_KEYWORD_RETURN(INLINE);}
new {CPP_KEYWORD_RETURN(NEW);}
operator {CPP_KEYWORD_RETURN(OPERATOR);}
overload {CPP_KEYWORD_RETURN(OVERLOAD);}
protected {CPP_KEYWORD_RETURN(PROTECTED);}
private {CPP_KEYWORD_RETURN(PRIVATE);}
public {CPP_KEYWORD_RETURN(PUBLIC);}
this {CPP_KEYWORD_RETURN(THIS);}
virtual {CPP_KEYWORD_RETURN(VIRTUAL);}
{identifier} {IDENTIFIER_RETURN();}
{decimal_constant} {NUMERICAL_RETURN(INTEGERconstant);}
{octal_constant} {NUMERICAL_RETURN(OCTALconstant);}
{hex_constant} {NUMERICAL_RETURN(HEXconstant);}
{floating_constant} {NUMERICAL_RETURN(FLOATINGconstant);}
"L"?[']{c_char}+['] {
NUMERICAL_RETURN(CHARACTERconstant);
}
"L"?["]{s_char}*["] {
LITERAL_RETURN(STRINGliteral);}
"(" {PPOP_RETURN(LP);}
")" {PPOP_RETURN(RP);}
"," {PPOP_RETURN(COMMA);}
"#" {NAMED_PPOP_RETURN('#') ;}
"##" {NAMED_PPOP_RETURN(POUNDPOUND);}
"{" {ASCIIOP_RETURN(LC);}
"}" {ASCIIOP_RETURN(RC);}
"[" {ASCIIOP_RETURN(LB);}
"]" {ASCIIOP_RETURN(RB);}
"." {ASCIIOP_RETURN(DOT);}
"&" {ASCIIOP_RETURN(AND);}
"*" {ASCIIOP_RETURN(STAR);}
"+" {ASCIIOP_RETURN(PLUS);}
"-" {ASCIIOP_RETURN(MINUS);}
"~" {ASCIIOP_RETURN(NEGATE);}
"!" {ASCIIOP_RETURN(NOT);}
"/" {ASCIIOP_RETURN(DIV);}
"%" {ASCIIOP_RETURN(MOD);}
"<" {ASCIIOP_RETURN(LT);}
">" {ASCIIOP_RETURN(GT);}
"^" {ASCIIOP_RETURN(XOR);}
"|" {ASCIIOP_RETURN(PIPE);}
"?" {ASCIIOP_RETURN(QUESTION);}
":" {ASCIIOP_RETURN(COLON);}
";" {ASCIIOP_RETURN(SEMICOLON);}
"=" {ASCIIOP_RETURN(ASSIGN);}
".*" {NAMEDOP_RETURN(DOTstar);}
"::" {NAMEDOP_RETURN(CLCL);}
"->" {NAMEDOP_RETURN(ARROW);}
"->*" {NAMEDOP_RETURN(ARROWstar);}
"++" {NAMEDOP_RETURN(ICR);}
"--" {NAMEDOP_RETURN(DECR);}
"<<" {NAMEDOP_RETURN(LS);}
">>" {NAMEDOP_RETURN(RS);}
"<=" {NAMEDOP_RETURN(LE);}
">=" {NAMEDOP_RETURN(GE);}
"==" {NAMEDOP_RETURN(EQ);}
"!=" {NAMEDOP_RETURN(NE);}
"&&" {NAMEDOP_RETURN(ANDAND);}
"||" {NAMEDOP_RETURN(OROR);}
"*=" {NAMEDOP_RETURN(MULTassign);}
"/=" {NAMEDOP_RETURN(DIVassign);}
"%=" {NAMEDOP_RETURN(MODassign);}
"+=" {NAMEDOP_RETURN(PLUSassign);}
"-=" {NAMEDOP_RETURN(MINUSassign);}
"<<=" {NAMEDOP_RETURN(LSassign);}
">>=" {NAMEDOP_RETURN(RSassign);}
"&=" {NAMEDOP_RETURN(ANDassign);}
"^=" {NAMEDOP_RETURN(ERassign);}
"|=" {NAMEDOP_RETURN(ORassign);}
"..." {NAMEDOP_RETURN(ELLIPSIS);}
%%
/* I won't bother to provide any error recovery. I won't even handle
unknown characters */
/*******************************************************************/
int isaTYPE(string)
char * string;
{
/* We should really be maintaining a symbol table, and be
carefully keeping track of what the current scope is (or in the
case of "rescoped" stuff, what scope to look in). Since the
grammar is not annotated with actions to track transitions to
various scopes, and there is no symbol table, we will supply a
hack to allow folks to test the grammar out. THIS IS NOT A
COMPLETE IMPLEMENTATION!!!! */
return ('A' <= string[0] && 'Z' >= string[0]);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?