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; }
|
发表于 @ 2007年08月31日 17:24:00|评论(loading...)|编辑