我正在制作 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 中添加这个终端,然后考虑一个扫描程序的错误例程让它跳过它吗?
通常的语言规范如何处理这个问题?