📄 3.6.1c.htm
字号:
<html>
<head>
<title>编译原理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link type="text/css" rel="stylesheet" href="../css/specification.css">
</head>
<BODY bgColor=lavender>
<table align=right width=300>
<tr>
<td><IMG onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='3.6.1b.htm'" src="../images/previous.gif"></IMG></td>
<td><IMG onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='3.6.1d.htm'" src="../images/next.gif"></IMG></td>
</tr>
</table>
<br><br>
<table border=0>
<tr>
<td width=10></td>
<td>
<p> <b>例3.7 </b>对于表3.5中单词,我们给出识别它的lex程序,考察一下此程序</p>
</td>
</tr>
<tr>
<td width=10></td>
<td>
<table width="100%">
<tr>
<td width=200>
<td align=left>
<br>
<font color=blue>%{ </font><br>
<font color=green>/*显明常量 <br>
LT,LE,EQ,NE,GT,GE, <br>
IF, THEN, ELSE,ID, NUMBER, RELOP的定义*/ </font><br>
<font color=blue>%}</font> <br>
<font color="green">/*正规定义*/ </font><br>
delim     [\t\n] <br>
ws     {delim}+ <br>
<br>
letter     [A-Za-z] <br>
digit     [0-9] <br>
id     letter}({letter}|{digit})* <br>
number     {digit}+(\.{digit}+)?(E[+\-]?{digit}+)? <br>
<font color=blue>%% </font><br>
{ws}    {<font color="green">/*没有动作,也不返回*/</font>} <br>
if     {<font color=blue>return</font> (IF);} <br>
then     {<font color=blue>return</font> (THEN);} <br>
else     { <font color=blue>return</font> (ELSE);} <br>
{id}    {yylval = install_id(); <font color=blue>return</font>(ID);} <br>
{number}    {yylval=install_num();<font color=blue>return</font>(NUMBER);} <br>
“<”    {yylval = LT; <font color=blue>return</font> (RELOP);J <br>
“<=”    {yylval=LE; <font color=blue>return</font>(RELOP);} <br>
“=”     {yylval=EQ; <font color=blue>return</font>(RELOP);} <br>
“<>”    {yylval = NE; <font color=blue>return</font>(RELOP);) <br>
“>”    {yylval = GT; <font color=blue>return</font>(RELOP);} <br>
“>=”    {yylval = GE; <font color=blue>return</font>(RELOP)} <br>
<font color=blue>%% </font><br>
install_id()<br>
    {
<font color="green">/*把单词装入符号表并返回指针。 <br>
yytext指向该单词的第一个字符, <br>
yyleng给出它的长度*/ <br>
</font>} <br>
install_num()<br>
    {
<font color="green">/*类似上面过程,但单词是数*/ </font>}
<P></P><!--p> 图 3.18</p-->
<br>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td width=10></td>
<td>
<p>在声明节,可以看见由翻译规则仅用的某些显明常量的声明,这些声明由特别的括号<font class="emphasize">%{</font>和<font class="emphasize">%}</font>包围。出现在括号中的任何东西都直接抄写到词法分析器lex.yy.c中,不作为正规定义和翻译规则的一部分。在第三节中的辅助过程也按同样方式处理,程序中有两个过程install_id()和install_num(),它们由翻译规则使用,被逐字抄入lex.yy.c中。 </p>
</td></tr>
</table>
<table align=right width=300>
<tr>
<td><IMG onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='3.6.1b.htm'" src="../images/previous.gif"></IMG></td>
<td><IMG onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='3.6.1d.htm'" src="../images/next.gif"></IMG></td>
</tr>
</table>
</BODY>
</html>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -