-->

在野牛语义类型检查分析(semantic type checking analysis in bis

2019-07-30 03:17发布

我一直在试图发现到处都是例子,但它已经是徒劳的。

我试图写一个基本的Ruby解释器。 对于这一点,我写了一个柔性的词汇文件,其中包含标志物辨别句子,语法文件。

我希望我的语法语义包含类型检查。

我的语法文件包含,例如:

arg : arg '+' arg 

这应该是整数和浮点数的有效规则。

据我读过,我可以为一个非终端如精氨酸,像这样指定类型:

%type <intval> arg

其中“INTVAL”是在类型联合并对应于INT C类。

但是,这仅仅是对于整数,我不知道如何使规则有效,比如,花车。 我想到了有两个不同的规则,一个是整数,一个用于花车,如:

argint : argint '+' argint
argfloat : argfloat '+' argfloat

但我相信有这样做,因为这样的暴行需要我有规矩,让花车和整数之间增加的多,更好的方法。

我发现所有的例子都只有一个类型(通常在类似计算器的例子整数)。

如何能够做到指定的规则,如除了可以有整型和浮点作为参数?

非常感谢你。

Answer 1:

这不是你希望的答案。 我认为,你有没有看到你想要什么例子的原因是,这是不切实际的强制输入的语法文件(.Y)规则; 相反,开发商在程序.C或代码的.cpp做到这一点。 一般情况下,你将不得不做解析的输入的一些分析,无论如何,所以它是像你那样做强制执行语义规则的副产品。

顺便说一句,我不太明白你是如何给你的语法,你在你的问题重现片段解析表达式。

这也是为什么我主张这是不切实际的。 (1)你的类型信息具有通过语法的非端子渗所有。 (2)更糟的是,它具有在变量名中得到反映。

考虑对其进行解析时可以使用标识符,数字常量,和四个计算器运营商简单赋值语句的这种玩具的例子。 的NUMBER令牌可以像42的整数或浮点数等3.14。 让我们说,一个标识符是一个字母,AZ。

%token IDENTIFIER NUMBER

%%

stmt : IDENTIFIER '=' expr
     ;

expr : expr '+' term
     | expr '-' term
     | term
     ;

term : term '*' factor
     | term '/' factor
     | factor
     ;

factor : '(' expr ')'
       | '-' factor
       | NUMBER
       | IDENTIFIER
       ;

现在,让我们尝试引入类型规则。 我们会在NUMBER标记分成FLT_NUMBER和INT_NUMBER。 我们的exprtermfactor的非终端分成两个还有:

%token IDENTIFIER FLT_NUMBER INT_NUMBER

stmt : IDENTIFIER '=' int_expr
     | IDENTIFIER '=' flt_expr
     ;

int_expr : int_expr '+' int_term
         | int_expr '-' int_term
         | int_term
         ;

flt_expr : flt_expr '+' flt_term
         | flt_expr '-' flt_term
         | flt_term
         ;

int_term : int_term '*' int_factor
         | int_term '/' int_factor
         | int_factor
         ;

flt_term : flt_term '*' flt_factor
         | flt_term '/' flt_factor
         | flt_factor
         ;

int_factor : '(' int_expr ')'
           | '-' int_factor
           | INT_NUMBER
           | int_identifier
           ;

flt_factor : '(' flt_expr ')'
           | '-' flt_factor
           | FLT_NUMBER
           | flt_identifier
           ;

int_identifier : IDENTIFIER ;

flt_identifier : IDENTIFIER ;

由于我们的语法矗立在这一点上,有一个矛盾:解析器无法分辨是否承认一个标识符作为int_identifierflt_identifier 。 所以它不知道是否减少A = B作为IDENTIFIER = int_exprIDENTIFIER = flt_expr

(这里就是我的红宝石的理解是有点软:)红宝石(最喜欢的语言)并没有提供在词汇层面的方式来确定数值类型的标识符。 与老同学BASIC,其中A代表数目,而$表示字符串对比这一点。 换句话说,如果你发明了哪里,比如说,A#表示整数和A表示浮一种语言,那么你可以做这项工作。

如果你想允许有限的混合类型表达式,像int_term '*' flt_factor ,那么你的语法会得到更加复杂。

可能会有方法来解决这些问题。 从比YACC /野牛等技术构建的解析器可能更容易。 至少,也许我的素描会给你一些想法进一步追究。



文章来源: semantic type checking analysis in bison