parsing - 当不可避免的字符被转义时该怎么办?

标签 parsing escaping language-design

在设计(迷你)语言时: 当某些字符应该被转义以失去特殊含义时(如某些编程语言中的引号),当不可转义的字符(例如从不具有特殊含义的普通字符)出现时,应该做什么,尤其是从安全角度来看逃脱?错误应该被“错误”编辑,还是应该丢弃该字符,或者它是否应该像没有转义一样出现在输出中?

例子: 在一种简单的语言中,字符串由双引号 (") 分隔,并且给定字符串中的任何引号都用反斜杠 (\) 转义:对于输入"We\said,\"We want Moshiach Now\"" -- 应该如何处理 said 中的字母 s 这是逃脱了?

最佳答案

发生这种情况时,我更喜欢词法分析器提示。词法分析器/解析器应该严格遵守语法;以后总是可以放松的。如果你马虎,你会发现你无法收回你认为不是你做出的决定。

假设您最初决定将“反斜杠 not-an-escape”视为那对字符,并且“T”是 今天不是逃脱。一段时间后,您决定扩展该语言,并希望“\T”具有特殊含义,于是您更改了您的语言。

你会发现一群愤怒的程序员冲进了你的设计城堡, 因为对他们来说,“\T”意味着“\”“T”(或“T”取决于您的默认决定), 而你刚刚破坏了他们的代码。你羞愧地低下头,收回决定, 然后意识到...哎呀,没有更多可用的转义字符了!

本类(class)适用于您的语言中未明确定义的任何语法。如果它不是明确合法的,它应该是隐式非法的,你的编译器应该检查它。否则您将永远无法扩展您成功的语言。

如果您的语言不会成功,您可能不会太在意。

关于parsing - 当不可避免的字符被转义时该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5085827/

相关文章:

c++ - 在 C++ 中解析相当复杂但结构化的文件

javascript - 通过字符数组转义字符串

language-design - 定义问题而不是解决方案的编程语言?

java - 使用公共(public)实例变量而不是调用方法来检索数组长度的动机是什么?

language-design - 当有人编写一种新的编程语言时,他们用什么来编写它?

java - 如何在 Android 的 ListView 中显示解析后的 html

php - PHP解析/语法错误;以及如何解决它们

javascript - 为什么需要 8 个反斜杠?

c++ - 用于从文件填充类的 Lexer/Parser 的语法规则

java - 你需要在 Java 中转义 * 字符吗?