C++ flex和bison:如何识别数组

C++ flex和bison:如何识别数组,c++,bison,flex-lexer,C++,Bison,Flex Lexer,我正在和bison和flex一起玩,以了解口译员的工作方式。我已经做了一些事情,比如范围({INT:INT}或{INT:INT:INT}),字符串({string“这里有任何文本”}),等等,但我不能决定哪一个应该是正确的方式来帮助bison理解用户是否以[INT,INT,ID,ID,INT,…,INT,ID,…]的形式输入数组。 首先想到的是使用flex关键字BEGIN,然后一直看到行的末尾,但这似乎很愚蠢,因为您需要很多东西,比如了解下一个成员是INT还是ID,这不是一个好方法。我还能做什么

我正在和bison和flex一起玩,以了解口译员的工作方式。我已经做了一些事情,比如范围(
{INT:INT}
{INT:INT:INT}
),字符串({string“这里有任何文本”}),等等,但我不能决定哪一个应该是正确的方式来帮助bison理解用户是否以
[INT,INT,ID,ID,INT,…,INT,ID,…]的形式输入数组。

首先想到的是使用flex关键字
BEGIN
,然后一直看到行的末尾,但这似乎很愚蠢,因为您需要很多东西,比如了解下一个成员是INT还是ID,这不是一个好方法。我还能做什么?我更喜欢用bison来做,但我不知道如何让bison在
[
]
之间看起来是递归的,以获取它们包含的所有内容。我怎么做


提前谢谢

简单-只需创建一个递归规则

expr :- INT | ID;
array_expr :- array_expr expr | expr;
array :- '[' array_expr ']';

我做Bison已经有一段时间了,但这应该非常接近正确。

你知道如何构造LR(1)上下文无关语法来识别这样的数组吗?或者你的问题是如何将它转换成Bison能理解的格式?不知道。也许你可以推荐一些书或链接阅读?灰姑娘之书:自动机理论、语言和计算导论。这4个版本(包括“0”)在某种程度上在方法上明显不同:--我不确定,但我认为这涵盖了CFGs和LR(1)语法等,如果可能是从过于抽象的角度。你的背景中有很多正式的计算机科学理论吗?@yack:没有,我一点也没有,因为我是语言学家。:-)@DeadMG,你有没有其他的建议?我已经有一段时间没有构建LR(1)语法了,但出于某种原因,我认为
array_expr:-epsilon | array_expr expr
更好。这既允许使用空数组,也允许使用逻辑来确定遵循哪条规则可能更容易:但我上次这么做已经十年了!哦,epsilon是“匹配空字符串”标记的传统名称。不知道如何在
野牛
ese中表达。@Yakk:在
野牛
中,
ε
只是一个空的标记列表(即空格),但传统上写为
/*empty*/
,这对人类来说更为明显。一般来说,如果使用epsilon规则,使用右递归而不是左递归可以避免很多麻烦,但是在这种情况下,
expr
明确地以一个标记开始,所以没有问题。非常感谢,这很有效!也许你甚至知道如何获取元素?我知道第一个元素是1美元,第二个元素是2美元,等等,但有没有可能计算出我们有多少元素,它们是什么?