我正在制作一个从RTF到HTML的简单解析器。
我有以下原始RTF:
who\\~nursed\\~and
根据RTF规范,\〜是非破坏空间的关键字。
关键字的结尾由分隔符标记,分隔符定义如下:
空间。这仅用于分隔控制字,在后续处理中被忽略。
数字或ASCII减号( - ),表示数字参数与控制字相关联。然后,随后的数字序列由除ASCII数字之外的任何字符(通常以反斜杠开头的另一个控制字)分隔。参数可以是正十进制数或负十进制数。该数值的范围标称为-32768到32767,即带符号的16位整数。少量控制字的取值范围为-2,147,483,648到2,147,483,647(32位有符号整数)。这些控制字包括\ binN,\ revdttmN,\ rsidN相关控制字和一些图片属性,如\ bliptagN。这里N代表数字参数。 RTF解析器必须允许最多10个数字,可选地前面带有减号。如果分隔符是空格,则将其丢弃,也就是说,它不包含在后续处理中。
除字母或数字之外的任何字符。在这种情况下,分隔符将终止控制字,而不是控制字的一部分。如反斜杠“\”,表示后面跟着一个新的控制字或控制符号。
据我了解,上面突出显示的部分是此特定实例中使用的规则。但如果是这种情况,那么我的解析器会读到〜符号,并得出结论,因为这不是字母或数字,所以它不是关键字的一部分。 目前这导致以下输出:
谁〜调养〜和
我有以下用于阅读关键字的代码:
public GetKeyword(index: number): KeywordSet {
var keywordarray: string[] = [];
var valuearray: string[] = [];
index++;
while (index < this.m_input.length) {
var remainint = this.m_input.substr(index);
//Keep going until we hit a delimiter
if (this.m_input[index] == " ") {
index++;
break;
} else if (this.IsNumber(this.m_input[index])) {
valuearray.push(this.m_input[index]);
} else if (this.IsDelimiter(this.m_input[index])) {
break;
} else keywordarray.push(this.m_input[index]);
index++;
}
var value: number = null;
if (valuearray.length > 0) value = parseInt(valuearray.join(""));
var keywordset = new KeywordSet(keywordarray.join(""), index, value);
return keywordset;
}
private IsDelimiter(char: string): boolean {
if (char == "*" || char == "'") return false;
return !this.IsLetterOrDigit(char);
}
当GetKeyword()到达“〜”时,它将其识别为分隔符,并停止读取,从而产生一个空关键字作为返回值。
我没有为此构建AST。不认为这有必要吗?
答案 0 :(得分:0)
您的问题中的引用描述了名为control word
的实体的语法,但\~
实际上是名为control symbol
的不同实体。控制符号具有不同的语法:
控制符号
控件符号由反斜杠后跟单个非字母字符组成。例如,\〜(反斜杠代字号)表示不间断的空格。控制符号没有分隔符,即控制符号后面的空格被视为文本,而不是分隔符。