序言
我正在创建自己的 JSON 词法分析器,并最终创建一个完整的解析器,纯粹是作为一种学习体验,因为这是我喜欢做的事情。据我了解,词法分析器的工作是对数据进行标记(将流分解为单独的标记)并确定每个标记的数据类型(真、假、字符串、数字等)。
我编写了一个基本的词法分析器,可以根据 json.org 的规范正确处理数字。我决定某些规则可以而且应该由词法分析器进行验证,例如:
0
”和“0.1
”是有效的,“01
”不是)0.1e1.5
”无效)等等
这对我来说很有意义,因为词法分析器的工作是识别标记。尽管看起来“几乎”正确,但像“01
”这样的无效 JSON 数据不是令牌,就像“
;%*
”一样,它显然是垃圾,也不是令牌。
同样,这样,像“{ "age": 0001 }
”这样的无效 JSON 在最早阶段就被发现是无效的,并且可以使用未定义的令牌立即中止处理。问题我的问题涉及读取词法分析器中的字符串值。
我的字符串读取逻辑可以很好地转义引号(即'
"some \"text\""
')。这是显而易见的,因为转义引号不应该结束字符串标记。我的目标是正确支持所有其他可转义字符,包括 4 十六进制数字 unicode ('
\u01ab
')。但是,我不确定识别和验证这样的转义序列是否应该由词法分析器负责,或者是否应该稍后进行。词法分析器是否应该保证 STRING 令牌完全有效?
以无效的 JSON '
"\u012"
' 为例。它在
\u
字符后面只有 3 个十六进制数字,因此无效。在 jsonlint.com上验证此字符串会出现以下错误: 预期为“STRING”、“NUMBER”、“NULL”、“TRUE”、“FALSE”、“{”、“[”,结果为“未定义”
parser我知道这是词法分析过程中的失败,因为
期望列出的令牌之一,但lexer识别出无效字符串并返回未定义的令牌。 相反,如果我尝试在 freeformatter.com/json-escape 上对相同的字符串值进行转义,错误消息会让人觉得词法分析器生成了字符串标记,并且在解析/解释数据期间发生了失败
无法处理您的输入字符串。无法解析 unicode 值:012"我更倾向于相信 jsonlint.com 在这里可能是正确的,并且无效的转义字符串不会被视为有效令牌确实有意义。任何意见将不胜感激
&我应该在词法分析器和解析器之间划清界限吗?充分回答我的问题。 对于重复的内容深表歉意