编译原理习题CH3-1

3.1.1 练习

题目:
将以下 C++ 程序分解为适当的词法单元(lexemes),并给出这些词法单元应该关联的词法值:

1
2
3
4
5
float limitedSquare(x){
float x;
/* returns x-squared, but never more than 100 */
return (x <= -10.0 || x >= 10.0) ? 100 : x * x;
}

答案解析:

词法单元(lexemes)是编程语言的基本单位,如关键字、标识符、运算符、常量等。通过分析代码中的每个部分,找到其对应的词法单元:

1
2
3
4
5
<float> <id, limitedSquare> <(> <id, x> <)> <{>
<float> <id, x>
<return> <(> <id, x> <op, "<="> <num, -10.0> <op, "||"> <id, x> <op, ">="> <num, 10.0> <)>
<op, "?"> <num, 100> <op, ":"> <id, x> <op, "*"> <id, x>
<}>

分析:

  1. <float>: 关键字,表示数据类型。
  2. <id, limitedSquare>: 标识符,表示函数名。
  3. <(<): 分别表示左括号和右括号,标识函数参数列表的开始和结束。
  4. <id, x>: 标识符,表示函数参数和变量。
  5. <return>: 关键字,表示函数返回语句。
  6. <op, "<=">: 运算符,表示小于等于。
  7. <num, -10.0>: 数字常量,表示-10.0。
  8. <op, "||">: 运算符,表示逻辑或。
  9. <op, ">=">: 运算符,表示大于等于。
  10. <num, 10.0>: 数字常量,表示10.0。
  11. <op, "?">: 运算符,表示三元运算符。
  12. <num, 100>: 数字常量,表示100。
  13. <op, ":">: 运算符,表示三元运算符的另一部分。
  14. <id, x>: 标识符,表示变量x。
  15. <op, "\*">: 运算符,表示乘法。
  16. <id, x>: 标识符,表示变量x。

通过这种分解方式,可以看出每个部分的词法单元及其对应的词法值。


3.1.2 练习

题目:
标签语言(如 HTML 或 XML)与传统的编程语言有所不同,标签(tags)通常非常多(如 HTML),或者是用户自定义的(如 XML)。此外,标签可以有参数。请建议如何将以下 HTML 文档分解为适当的词法单元,并给出它们应该关联的词法值:

1
2
3
4
Here is a photo of <b>my house</b>;
<p><img src="house.gif"/><br/>
see <a href="morePix.html">More Picture</a> if you
liked that one.</p>

答案解析:

HTML 文档中的词法单元包括文本节点、标签节点和属性等。通过分析 HTML 代码,以下是词法单元的分解:

1
2
3
4
<text, "Here is a photo of"> <nodestart, b> <text, "my house"> <nodeend, b>
<nodestart, p> <selfendnode, img> <selfendnode, br>
<text, "see"> <nodestart, a> <text, "More Picture"> <nodeend, a>
<text, "if you liked that one."> <nodeend, p>

分析:

  1. <text, "Here is a photo of">: 文本节点,表示纯文本内容。
  2. <nodestart, b>: 标签节点,表示开始的<b>标签,表示加粗。
  3. <text, "my house">: 文本节点,表示加粗标签内的内容。
  4. <nodeend, b>: 标签节点,表示结束的</b>标签。
  5. <nodestart, p>: 标签节点,表示开始的<p>标签,表示段落。
  6. <selfendnode, img>: 自闭合标签,表示<img>标签,它没有结束标签。
  7. <selfendnode, br>: 自闭合标签,表示<br>标签,表示换行。
  8. <text, "see">: 文本节点,表示普通文本“see”。
  9. <nodestart, a>: 标签节点,表示开始的<a>标签,表示超链接。
  10. <text, "More Picture">: 文本节点,表示链接中的文本内容。
  11. <nodeend, a>: 标签节点,表示结束的</a>标签。
  12. <text, "if you liked that one.">: 文本节点,表示普通文本内容。
  13. <nodeend, p>: 标签节点,表示结束的</p>标签。

总结:

  • HTML 文档中的词法单元包括 文本节点标签节点(包括自闭合标签和有开始和结束标签的节点)。对于每个标签,除了标签名称外,还可能包含属性(如 <img src="house.gif"/>)。通过分解文档内容,可以明确地把文本和标签分别处理,并为每个标签和文本分配适当的词法值。

总结

词法分析的目标是将源代码(或文本)分解成基本的词法单元,这些词法单元是编译过程中的基础部分。对于编程语言和标记语言,分词的方法略有不同:

  1. 编程语言:词法单元通常包括关键字、标识符、常量、运算符等。
  2. 标记语言(如 HTML):除了常规的文本,还涉及标签、属性等元素。

通过精确的词法分析,可以有效地为语法分析奠定基础,识别文法错误和代码结构。