我正在用我自己的脚本语言构建一个像编译器一样的应用程序。用户将输入代码,输出将是另一个应用程序。所以我需要告诉用户哪些行是错的,为什么是错的。
但我不知道如何开始。
我想:所有行都以关键字开头,除了那些以变量开头的行。太不一样了,错了。因此,我可以计算下一个有效条目并检查它们。
同样,我认为我可以检查每一行,但这很复杂,因为我可以有这个
var varName { /* ... */ };
或
var varName {
/* ... */
};
或者
var varName
{
/* ... */
};
那么为什么不删除换行符并检查呢?因为我将丢失行号,在这种情况下,行号是最重要的。也许我要在有和没有换行符的代码之间创建一个映射
但首先我想听听你,如果你已经有了这样的经验,或者你有什么想法。
谢谢
有形式语言来描述语言的语法和语义,并且有工具可以从这些描述中生成解析器。我建议初学者阅读flex和bison。
编写自己的语言将相当复杂。但完全可行。
为了能够在语法意义上识别一行是否错误,您需要构建一个解析器。解析器检查上下文无关的语法,从其标记中找到结构的正确派生。
首先需要对文件进行标记,然后将其重构为解析树(以检查语法)。
我上过这门课,cs241。有一套很好的课程笔记里面都有详细的解释。https://github.com/christhomson/lecture-notes/blob/master/cs241.pdf
您应该检查以下工具:lex
, bison
和yacc
。
lex
是词法分析器生成器。它生成一个代码,该代码可用于将脚本分解为令牌(如数字,关键字等…)。
bison
和yacc
都是解析器生成器。两者都可用于生成解析语言的代码(将令牌组合为语句)。
只要谷歌这些工具的教程。