- 1、本文档共28页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
lexyacc使用基本
flex/bison使用基础 定义部分 规则部分 用户子程序部分 第一部分 定义部分 定义部分 %{ … … …. %} 正规式 内容 Include、声明语句等C语句及正则表达式 %{ #include “ stdio.h” #include”y.tab.h” int lineno %} delim [\t\n] letter [A-Za_z] digit [0-9] id {letter}({letter}|{digt})* 第二部分 规则部分 规则部分起始于%%,终止于%%,其间是词法规则(正则表达式)和相应的动作组成 格式 P1 {A1} P2 {A2} P3 {A3} 其中,Pi是一个正规式(第一部分定义的正规式的名字) Ai是一个程序段{C语句} Lex中的正则表达式规则 转义字符: [ ]:表示一个集合,可以结合-表示一个范围,如[abc],[a-zA-Z] ? * + :0或1次,任意次,至少一次 . :任意一个符号 |:二选一 ():分组,括号内的内容被看作一个原子,如(ab) 识别规则 %% \n {++num_line;} [A-Za-z]+ { ++num_words;} . {++num_chars;} %% 注意: 在识别规则中引用正规式的名字时,要用{}分隔。例如:{letter}({digit}|{letter})* 用户子程序部分 包含用c语言编写的子程序,这些子程序可以用在前面的动作中,这样可以达到简化编程的目的。 Lex 编程的第三段,也就是最后一段覆盖了 C 的函数声明(有时是主函数)。注意这一段必须包括 yywrap() 函数的定义。 用户子程序的相关问题 Main(int argc, char * argv[]) { --argc; ++argv /*跳过对第一个文件,即main 函数多对应的.exe文件*/ if (argc0) yyin= fopen(argv[0],’r’); else yyin=stdin yylex(); } 一个完整的lex(flex)程序 %{ ???????? int?wordCount?=?0; ???????%} ??chars [A-za-z\‘\.\“] ????????numbers ?([0-9])+ ????????delim? [\n\t] ????????whitespace? {delim}+ ????????words? {chars}+ ???????? %% {words} ? {?wordCount++;?} {whitespace} ? {?} {numbers}? {numcount++?} %% void?main() ????????{ ??????? ?yylex();?/*?start?the????analysis*/ ????????printf(?No?of?words:???%d\n,?wordCount); ????????} ????????int?yywrap() ????????{ ???????? return?1; ????????} 文法分析器生成工具bison Yacc/Bison是一个通用的工具,能够根据用户指定的规则,生成一个词法分析程序。 bison/yacc文件的格式 declarations(声明) %% rules(规则) %% programs(代码) 声明段 声明段声明一些符号常量,可以为空。 lex一样,声明段中可以有出现在目标C程序中的代码,放在%{…%}中 还有一些yacc关键词可以指示出token的结合顺序: %left 左结合 %right 右结合 %nonassoc 不结合 %token 声明token %{ # include stdio.h # include ctype.h int regs[26]; int base; %} %start list %token DIGIT LETTER 规则段 规则段的结构如下, A?: BODY?; A表示非终结符名, BODY表示产生式和动作。 产生式包括非终结符和终结符,非token的终结符用“”引用。动作(action)则是在输入被当前规则识别出来时而执行的。动作实际上就是C的代码,写在{ }中。 为了沟通词法分析器和动作,yacc引入了形式变量,以$开头。如果希望获得词法分析器和前面的动作返回的值,我们可以使用$1,$2,…。$i表示一
您可能关注的文档
最近下载
- 管理学论文5000字.docx VIP
- 新修订特种作业(高处安装、维护、拆除作业)考试题库(核心题版).pdf VIP
- 《服装设计基础》知识考试复习题库资料(含答案).pdf VIP
- 2025年医学高级职称-精神病学(医学高级)考试近5年真题荟萃附答案.docx
- 2025年医学高级职称-精神病学(医学高级)考试近5年真题荟萃附答案.docx
- 2024必威体育精装版传唤证模板.doc VIP
- 2025年医学高级职称-精神病学(医学高级)考试近5年真题集锦(频考类试题)带答案.docx
- 2025年高压电工复审考试题库库+答案.docx VIP
- 2025年医学高级职称-精神病学(医学高级)考试近5年真题集锦(频考类试题)带答案.docx
- 车轮制动器教案.doc VIP
文档评论(0)