JSON 字符串中的转义 unicode 十六进制值“\u0000”是否应该由词法分析器或解析器进行验证?

问题描述 投票:0回答:1

序言

我正在创建自己的 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 在这里可能是正确的,并且无效的转义字符串不会被视为有效令牌确实有意义。任何意见将不胜感激

json parsing lexer
1个回答
0
投票
解析数字和字符串是词法分析器的工作吗?

我应该在词法分析器和解析器之间划清界限吗?充分回答我的问题。 对于重复的内容深表歉意

© www.soinside.com 2019 - 2024. All rights reserved.