用C语言构建lexer

用C语言构建lexer,c,implementation,finite-automata,C,Implementation,Finite Automata,我想用C语言构建一个lexer,我正在遵循,我可以理解状态转换,但如何实现它们 有更好的书吗 事实上,我必须通过许多状态解析一个字符串,这样我才能判断该字符串是否可接受 您可以使用单个状态变量实现简单的状态转换,例如,如果您希望在start->part1->part2->end状态之间循环,那么您可以使用枚举跟踪当前状态,并对要在每个状态下运行的代码使用switch语句 enum state { start=1, part1, part2, end} mystate; // ... mysta

我想用C语言构建一个lexer,我正在遵循,我可以理解状态转换,但如何实现它们

有更好的书吗


事实上,我必须通过许多状态解析一个字符串,这样我才能判断该字符串是否可接受

您可以使用单个状态变量实现简单的状态转换,例如,如果您希望在start->part1->part2->end状态之间循环,那么您可以使用枚举跟踪当前状态,并对要在每个状态下运行的代码使用switch语句

enum state { start=1, part1, part2, end} mystate;

// ...
mystate = start;
do {
  switch (mystate) {
    case start:
      // ...
    case part1:
      // ...
    case part2:
      // ...
      if (part2_end_condition) mystate = end; // state++ will also work
      // Note you could also set the state back to part1 on some condition here
      // which creates a loop
      break;
  }
} while (mystate != end);
对于依赖于多个变量的更复杂的状态转换,应使用如下表/数组:

var1    var2    var_end    next_state
0       0       0          state1
0       1       0          state2
1       0       0          state3
1       1       0          state4
-1      -1      1          state_end // -1 represents "doesn't matter" here
G'day

假设你指的是关于编译器设计的龙书,我建议你看看编译器工具

这个页面本身很小,但是有链接,可以链接到词法分析器的各种优秀资源


干杯,

如果你正在寻找比《龙之书》更现代的治疗方法:安德鲁·W·阿佩尔和玛亚·金斯伯格,《现代》,剑桥大学出版社,2008年

第二章是词汇分析:词汇标记、正则表达式、有限自动机;不确定性有限自动机;词法分析器生成器


请看

有多种方法可以做到这一点。每个正则表达式都直接对应于一个简单的结构化程序。例如,数字的表达式可以是:

// regular expression
digit* [.digit*]
相应的C代码是:

// corresponding code
while(DIGIT(*pc)) pc++;
if (*pc=='.'){
    pc++;
    while(DIGIT(*pc)) pc++;
}
在我看来,构建lexer的转换表方法是不必要的复杂,而且运行速度明显较慢。

flex程序(lex的克隆)将为您创建一个lexer

给定一个包含lexer规则的输入文件,它将生成一个包含这些规则的lexer实现的C文件


因此,您可以检查flex的输出,了解如何用C编写lexer。也就是说,如果您不只是想使用flex的lexer…

哪一个?您需要给我们更多的信息。在实现状态转换的哪个方面你觉得困难?我不能构建一个lex吗??!!“有更好的书吗?”没有。state和mystate是不同的变量吗?对不起,那是个打字错误。state是枚举类型的名称,mystate是此处使用的唯一变量。您使用*pc然后使用pc[0]然后再次使用*pc有什么特殊原因吗?@John。固定的。我想这是一个意外的遗留问题,我想通过展望未来,排除单机版的情况。换句话说,我真的应该用if(DIGIT(pc[0])| |(pc[0]='.&&DIGIT(pc[1])来包装整件事。此外,Bison有一个免责声明,说Bison生成的代码可以在非GPL代码中使用。updated(删除了关于GPL的注释,我的坏,对不起)。请不要说别人傻。这有点冒犯,但只是开始的时候。Bison确实对生成的代码有问题,很高兴看到他们添加了免责声明。