ccaY 的补充内容

来源:互联网 发布:手机电视直播软件 编辑:程序博客网 时间:2024/04/27 22:20
 Lex 的常规表达式

常规表达式是一种使用元语言的模式描述。表达式由符号组成。符号一般是字符和数字,但是 Lex 中还有一些具有特殊含义的其他标记。 下面两个表格定义了 Lex 中使用的一些标记并给出了几个典型的例子。

用 Lex 定义常规表达式

 

字符 含义 A-Z, 0-9, a-z 构成了部分模式的字符和数字。 . 匹配任意字符,除了 /n。 - 用来指定范围。例如:A-Z 指从 A 到 Z 之间的所有字符。 [ ] 一个字符集合。匹配括号内的 任意 字符。如果第一个字符是 ^ 那么它表示否定模式。例如: [abC] 匹配 a, b, 和 C中的任何一个。 * 匹配 0个或者多个上述的模式。 + 匹配 1个或者多个上述模式。 ? 匹配 0个或1个上述模式。 $ 作为模式的最后一个字符匹配一行的结尾。 { } 指出一个模式可能出现的次数。 例如: A{1,3} 表示 A 可能出现1次或3次。 / 用来转义元字符。同样用来覆盖字符在此表中定义的特殊意义,只取字符的本意。 ^ 否定。 | 表达式间的逻辑或。 "<一些符号>" 字符的字面含义。元字符具有。 / 向前匹配。如果在匹配的模版中的“/”后跟有后续表达式,只匹配模版中“/”前 面的部分。如:如果输入 A01,那么在模版 A0/1 中的 A0 是匹配的。 ( ) 将一系列常规表达式分组。

常规表达式举例

 

常规表达式 含义 joke[rs] 匹配 jokes 或 joker。 A{1,2}shis+ 匹配 AAshis, Ashis, AAshi, Ashi。 (A[b-e])+ 匹配在 A 出现位置后跟随的从 b 到 e 的所有字符中的 0 个或 1个。

Lex 变量

 

yyin FILE* 类型。 它指向 lexer 正在解析的当前文件。 yyout FILE* 类型。 它指向记录 lexer 输出的位置。 缺省情况下,yyin 和 yyout 都指向标准输入和输出。 yytext 匹配模式的文本存储在这一变量中(char*)。 yyleng 给出匹配模式的长度。 yylineno 提供当前的行数信息。 (lexer不一定支持。) Name.y - 语法文件
       %
typedef char* string;
#define YYSTYPE string
%}
%token NAME EQ AGE
%%
file : record file
| record
;
record : NAME EQ AGE {
printf("%s is %s years old!!!/n", $1, $3); }
;
%%
int main()
{
yyparse();
return 0;
}
int yyerror(char *msg)
{
printf("Error
encountered: %s /n", msg);
}




Name.lex - Lex 的解析器文件
       %{
#include "y.tab.h"

#include <stdio.h>
#include <string.h>
extern char* yylval;
%}
char [A-Za-z]
num [0-9]
eq [=]
name {char}+
age {num}+
%%
{name} { yylval = strdup(yytext);
return NAME; }
{eq} { return EQ; }
{age} { yylval = strdup(yytext);
return AGE; }
%%
int yywrap()
{
return 1;
}
原创粉丝点击