Bison 命令本身作为参数

Bison 命令本身作为参数,bison,flex-lexer,Bison,Flex Lexer,我正在写一种简单的Basic语言。出于某种原因,我想避免使用'call'关键字,所以我不使用'call my_subroutine'来调用子例程,而是简单地使用'my_subroutine'。 例如:a=8:dou_某事:b=c+d 我有一个很好的方法来声明子例程。Flex也可以,它可以识别用户字符串中何时出现声明的子例程。然而,我在野牛宣言上有困难。我的工作如下: %token CALLSUB。。。 stmt: ... CALLSUB{$$=opr(CALLSUB,2,NULL,NULL);}

我正在写一种简单的Basic语言。出于某种原因,我想避免使用'call'关键字,所以我不使用'call my_subroutine'来调用子例程,而是简单地使用'my_subroutine'。
例如:a=8:dou_某事:b=c+d

我有一个很好的方法来声明子例程。Flex也可以,它可以识别用户字符串中何时出现声明的子例程。然而,我在野牛宣言上有困难。我的工作如下:

%token CALLSUB。。。
stmt:
...
CALLSUB{$$=opr(CALLSUB,2,NULL,NULL);}//注意:稍后参考
…

我的Flex识别任何子例程并返回

yylval.iValue=//正确的地址
返回CALLSUB

到目前为止,它似乎还可以,但没有返回任何参数,因为Bison中没有声明任何参数(参见上面的注释)

乍一看,人们可能认为它可以声明为变量而不是标记,但这会导致意想不到的恐惧


解决方案是什么?

你说“参数”是什么意思?您的意思是“语义值”,如“CALLSUB令牌的语义值”中的“语义值”吗


如果是这样,请声明
CALLSUB
具有一个类型(
%token CALLSUB
),并在
bison
操作中使用该值,该值将为
$1

,就是这样!谢谢!