识别CFG生产中的终端以前未定义为令牌

时间:2010-05-30 08:39:02

标签: compiler-construction code-generation computer-science context-free-grammar parser-generator

我正在制作LL(1)解析器的生成器,我的输入是CoCo / R语言规范。我已经有一个用于该输入的Scanner生成器。假设我有以下规范:

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”,则它将被接受,即将找到解析树。

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

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

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

1 个答案:

答案 0 :(得分:1)

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