我一直在试图发现到处都是例子,但它已经是徒劳的。
我试图写一个基本的Ruby解释器。 对于这一点,我写了一个柔性的词汇文件,其中包含标志物辨别句子,语法文件。
我希望我的语法语义包含类型检查。
我的语法文件包含,例如:
arg : arg '+' arg
这应该是整数和浮点数的有效规则。
据我读过,我可以为一个非终端如精氨酸,像这样指定类型:
%type <intval> arg
其中“INTVAL”是在类型联合并对应于INT C类。
但是,这仅仅是对于整数,我不知道如何使规则有效,比如,花车。 我想到了有两个不同的规则,一个是整数,一个用于花车,如:
argint : argint '+' argint
argfloat : argfloat '+' argfloat
但我相信有这样做,因为这样的暴行需要我有规矩,让花车和整数之间增加的多,更好的方法。
我发现所有的例子都只有一个类型(通常在类似计算器的例子整数)。
如何能够做到指定的规则,如除了可以有整型和浮点作为参数?
非常感谢你。
这不是你希望的答案。 我认为,你有没有看到你想要什么例子的原因是,这是不切实际的强制输入的语法文件(.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。 我们的expr
, term
和factor
的非终端分成两个还有:
%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_identifier
或flt_identifier
。 所以它不知道是否减少A = B
作为IDENTIFIER = int_expr
或IDENTIFIER = flt_expr
。
(这里就是我的红宝石的理解是有点软:)红宝石(最喜欢的语言)并没有提供在词汇层面的方式来确定数值类型的标识符。 与老同学BASIC,其中A代表数目,而$表示字符串对比这一点。 换句话说,如果你发明了哪里,比如说,A#表示整数和A表示浮一种语言,那么你可以做这项工作。
如果你想允许有限的混合类型表达式,像int_term '*' flt_factor
,那么你的语法会得到更加复杂。
可能会有方法来解决这些问题。 从比YACC /野牛等技术构建的解析器可能更容易。 至少,也许我的素描会给你一些想法进一步追究。