我正在从事宠物项目,我必须实施词法分析器/解析器。我正在阅读有关该主题的内容,并在我开始时对一个简单的数学解析器进行原型设计。
还有一些我仍然不太了解的东西,它是词法分析器和解析器之间的界限。请考虑以下语法错误的表达式:
+1.234.2 + pi
我目前正在将此解释为以下内容:
UnaryPlusOperatorToken: Lexeme "+" Pos: 1
NumberToken: Lexeme "1.234.2" Pos: 2
TriviaToken: Lexeme " " Pos: 9
BinaryAddToken: Lexeme "+" Pos: 10
TriviaToken: Lexeme " " Pos: 11
ConstantToken. Lexeme "pi" Pos: 12
好的,这里有几件事情:
NumberToken
中错误的额外小数句点,并在"错误包中添加错误"我是通过整个解析上下文进行线程化还是应该是稍后捕获它的解析器?PlusToken
,然后让解析器弄清楚它是什么?我发现很难理解两者之间的界限。
答案 0 :(得分:1)
这是我的看法:
词法分析器是否真的关心NumberToken中错误的额外小数周期并将错误添加到“错误包”中我是在整个解析上下文中进行线程化还是应该是稍后捕获它的解析器?
让我们看看您的选择是什么,并比较利弊:
如果您停止以第二个小数点扫描,您的解析器将获得以下两个令牌:1.234.2
+
,并且必须发出类似“意外令牌”的错误。
如果词法分析器将private void SortingObservableCollection(ObservableCollection<MyObject> toSort)
{
Items = new ObservableCollection<MyObject>(toSort.OrderBy(x => x.Top).ThenBy(x => x.Left));
}
扫描为单个令牌,您就可以轻松发出“无效号码”之类的错误。
第二种选择会发出更好的错误信息,并且与第一种选择一样容易实现,所以我认为这是更好的解决方案。您在此处拥有无效令牌,请将其视为此类。
词法分析器是否应该将“+”区分为一个上下文中的一元运算符或另一个上下文中的二元运算符?或者它应该只是生成一个PlusToken,然后让解析器弄清楚它是什么?
不。词法分析器应该只输出toSort = toSort.OrderBy(x => x.Top).ThenBy(x => x.Left).ToList();
标记。解析器的作用是在解析器规则的上下文中进一步解释该令牌的含义。
词法分析器和解析器之间的限制有时会非常模糊。虽然有些问题可以很容易地在任何一方出现而没有任何问题,但如果你拨打错误电话,其他人会在以后咬你,所以在做出设计选择时要特别小心。