我正在为一种非常简单的编程语言编写 BNF 语法,并使用 Flex 和 Bison 进行编译。
我只有 3 种变量和常量类型:real、integer、string。
我的 .l 文件具有“ID”的标记定义,如下所示:
DIGIT [0-9]
LETTER [a-zA-Z]
ID {LETTER}({LETTER}|{DIGIT})*
Run Code Online (Sandbox Code Playgroud)
我的 .y 文件有一个标识符的定义,如下所示:
identifier:
ID;
Run Code Online (Sandbox Code Playgroud)
现在,我想使用标识符定义来构建变量和常量名称。但我也想限制对相同类型数据的赋值(例如,我不希望将字符串分配给整数变量)。所以我创建了一些规则来区分每种变量和常量:
id_variable_string:
identifier;
id_variable_integer:
identifier;
id_variable_real:
identifier;
Run Code Online (Sandbox Code Playgroud)
我对常量做了同样的事情。现在,在我的语言中,我有一个用于常量声明/定义的部分,然后是一个用于变量声明的部分。也就是说,常量在赋值的同时声明(类似于“myConstant = 123”),但必须首先声明变量,然后在专门为语句设计的部分中赋值。
例如,如果我想要一个整数和一个字符串变量,我必须首先声明它们:
STRING myStrVariable;
整数 myIntVariable;
然后,在为语句保留的区域中,我可以选择进行赋值(语句可以是赋值、决策、选择、输出等):
assignment:
id_variable_string ASSIGN_OPERATOR literal_string
| id_variable_string ASSIGN_OPERATOR id_const_string
| id_variable_string ASSIGN_OPERATOR id_variable_string
| id_variable_string ASSIGN_OPERATOR concatenacion
| id_variable_integer ASSIGN_OPERATOR id_const_integer
| id_variable_integer ASSIGN_OPERATOR id_variable_integer
| id_variable_integer ASSIGN_OPERATOR expression
| id_variable_integer ASSIGN_OPERATOR literal_integer
| id_variable_real ASSIGN_OPERATOR …
Run Code Online (Sandbox Code Playgroud) 在我的 UML 类图中,我通常通过将属性名称放在关联两个类的箭头上方来进行对象集合(与其他符号相反,后者只是添加带有表示多重性的括号的属性)。但是我有一些情况,其中有多个相同类型的对象集合。例如(一个非常简单的例子):
假设有一门课程有一些学生申请了它(所以我有一个学生的集合,假设一个属性是 Student 的 ArrayList,称为“applied”)。但是,我还需要保留实际参加过课程的学生的单独集合(比方说,“参加”:另一个属性是 ArrayList,或者甚至是不同的集合类型,如学生的 Vector)。
我应该在关系线上添加所有属性名称吗?
我正在寻找以标准 UML 方式执行此操作的方法。之所以澄清这一点,是因为我知道 UML 规则在我们需要时可以很灵活。