0

假设我想解析我的新语言,如下所示:

主.mylang

import "tags.mylang"
cat dog bacon

还有另一个文件tags.mylang看起来像这样:

cat "meow"
dog "woof"
bacon "sizzle"

运行main.mylang会输出

meow woof sizzle

我遇到的问题是“猫”、“狗”和“培根”是在一个单独的文件中定义的,正如我的mylang开发人员所实现的那样;即,我不能事先让它们成为语法的一部分。

是否可以在解析时将这些标签动态添加到语法中?我不想添加通配符\w+或其他东西,因为我希望它在无法识别的标签上出错。

编辑:我正在使用jison基于bison.

4

2 回答 2

2

我会假设标签都与变量的模式匹配,无论可能是什么模式。(\a\w*,也许)。定义一个以标签为键的字典;该值可以是您想要与标签关联的任何值。据我了解,您可以通过将它放在 object 中来使解析器和词法分析器都可以使用该字典parser.yy

变量的词法分析器规则是这样的(我对jison不太了解,所以这是基于bison+flex的):

{variable}    if (yytext in yy.tags) { return TAG; } else { return VARIABLE; }

如果您想为不同的标签使用不同的标记类型(可能是因为标签是语法概念的别名,或类似的东西),您可以将标记类型存储在标记字典中,以便您可以从词法分析器中返回它。

在标签定义文件的语法中,您可以通过将键和适当的值添加到yy.tags.

于 2013-03-13T15:54:23.503 回答
1

您可以使用\w+您建议的通配符匹配,然后在解析器的语义逻辑检测到无法识别/未定义的标记时使用YYERROR 宏来引发您自己的语法错误。

于 2013-03-12T14:32:54.807 回答