0

我正在制作 LL(1) 解析器的生成器,我的输入是 CoCo/R 语言规范。我已经为该输入准备了一个扫描仪生成器。假设我有以下规范:

COMPILER 1

CHARACTERS

digit="0123456789".

TOKENS
number = digit{digit}. 
decnumber = digit{digit}"."digit{digit}.

PRODUCTIONS

Expression = Term{"+"Term|"-"Term}.      
Term = Factor{"*"Factor|"/"Factor}.       
Factor = ["-"](Number|"("Expression")").
Number = (number|decnumber).

END 1.

所以,如果由这个语法生成的解析器接收到一个单词“1+1”,它就会被接受,即会找到一个解析树。

我的问题是,字符“+”从未在标记中定义,但它出现在非终端“表达式”中。我生成的 Scanner 应该如何识别它?它不会将其识别为令牌。

那么这是一个有效的输入吗?我应该在 TOKENS 中添加这个终端,然后考虑一个扫描程序的错误例程让它跳过它吗?

通常的语言规范如何处理这个问题?

4

1 回答 1

1

语法规则的 RHS 上的任何内容(不是语法符号本身的一部分)必须是非终结符号或终结符号(与“令牌”同义)。所以是的,你应该让你的运营商代币。查看 CoCo/R 文档,它似乎将接受文字字符串作为 PRODUCTIONS 部分中的终端符号,因此您可能不需要做任何其他事情......解析器生成器应该已经将它们视为标记。

于 2010-05-30T08:47:20.100 回答