首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用gocc在Golang中实现不区分大小写的词法分析器?

要在Golang中实现不区分大小写的词法分析器,可以使用gocc工具。gocc是一个生成器,可以根据给定的文法生成词法分析器和语法分析器。

以下是实现步骤:

  1. 安装gocc:使用以下命令安装gocc工具:
代码语言:txt
复制
go get github.com/goccmack/gocc
  1. 创建词法规则:在一个新建的文件中,定义词法规则。例如,我们想要识别一个简单的标识符,可以按照如下方式定义:
代码语言:txt
复制
%{
package lexer
%}

%token IDENTIFIER

%%

[A-Za-z_][A-Za-z0-9_]* {
    yylval = &yySymType{ 
        token: IDENTIFIER, 
        value: yytext, 
    }
    return IDENTIFIER
}

. {
    // 其他规则处理,比如错误处理
}
  1. 生成词法分析器:在终端中进入文件所在目录,并执行以下命令:
代码语言:txt
复制
gocc -a -p lexer lexer.bnf

其中,lexer.bnf是包含词法规则的文件名。

  1. 使用词法分析器:生成的词法分析器将自动生成一个lexer包。我们可以在代码中导入该包,并使用词法分析器进行词法分析。以下是一个简单的示例:
代码语言:txt
复制
package main

import (
    "fmt"
    "./lexer"
)

func main() {
    input := "hello World"
    l := lexer.NewLexer([]byte(input))
    
    for {
        tok := l.Lex()
        if tok == lexer.EOF {
            break
        }
        
        switch tok {
        case lexer.IDENTIFIER:
            fmt.Printf("识别到标识符:%s\n", l.Literal())
        }
    }
}
  1. 运行代码:在终端中运行该Go程序:
代码语言:txt
复制
go run main.go

输出将会是:

代码语言:txt
复制
识别到标识符:hello
识别到标识符:World

通过上述步骤,我们成功地在Golang中使用gocc实现了不区分大小写的词法分析器。请注意,在实际应用中,还需要根据具体需求定义更多的词法规则,并处理其他的词法单元。关于gocc的更多信息,请参考官方文档:gocc Github Repository

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

编译原理初学者入门指南

词法分析器(lexer)生成终结符,而语法分析器(parser)则利用自顶向下或自底向上方法,利用文法定义终结符和非终结符,将输入信息转换为 AST(抽象语法树)。...也就是我们在此次需求需要获得东西。 三、工程实践 我们案例是使用 golang 来编写 lexer 和 parser。 工程上,不同语言实践方式是不一样。...go get -u github.com/golang/tools/tree/master/cmd/goyacc 使用起来参数如下: 然后我们需要搞定词法分析器和语法分析器。... goyacc ,lexer 本身相对简单,自己编写 go 代码实现就够了,parser 部分所需文法约定,需要我们编写 .y 文件,也就需要了解 yacc 文法约定。...一开始我们只实现最简单语法规则,后面自己就会逐渐了解更高级文法规则了。 3.5 参考工程 goyacc 示例工程不多,推荐用 yacc 实现计算器例子,参考性比较差。

2.4K21

如何优雅使用 IPtables 多租户环境实现 TCP 限速

为了方便用户,开发时候不必自己开发环境跑一个 SideCar,我用 socat 一台开发环境机器上 map UDS 到一个端口。...这样用户开发时候就可以直接通过这个 TCP 端口测试服务,而不用自己开一个 SideCar 使用 UDS 了。 因为所有人都要用这一个地址做开发,所以就有互相影响问题。...我使用说明文档里用红色大字写了这是开发测试用,不能压测,还是有一些视力不好同事会强行压测。隔三差五我就得去解释一番,礼貌地请同事不要再这样做了。 最近实在累了。...详细实现方法可以参考这篇文章。 iptables 本身是无状态,每一个进入 packet 都单独判断规则。...Chain 加入到 INPUT ,对此端口流量进行限制。

2.4K20
  • Go 语言编译过程概述

    目录 编译原理概述 词法和语法分析器 类型检查 中间代码生成 机器码生成 预备知识 想要深入了解 Go 语言编译过程,需要提前了解一下编译过程涉及一些术语和专业知识。...编译器执行完语法分析之后会输出一个抽象语法树,这棵树会辅助编译器进行语义分析,我们可以用它来确定结构正确程序是否存在一些类型匹配或不一致问题。...根据 Wikipedia 对 SSA 介绍来看,中间代码中使用 SSA 特性能够为整个程序实现以下优化: 常数传播(constant propagation) 值域传播(value range...而语法分析输入就是词法分析器输出 Token 序列,这些序列会按照顺序被语法分析器进行解析,语法解析过程就是将词法分析生成 Token 按照语言定义好文法(Grammar)自下而上或者自上而下进行规约...中间代码生成 这一章节会详细介绍中间代码生成过程并简单介绍 Golang如何在中间代码中使用 SSA 特性,在这里就不展开介绍其他内容了。

    1.4K40

    一文读懂基于 Yaegi 解释器开发可热插拔 Traefik 插件

    — 03 — 基于 Golang 解释器类型 Go 语言本身是一种编译型语言,但是也可以通过编写解释器方式来实现解释执行。...它可以应用程序嵌入 Go 脚本,实现动态配置和扩展。此外,Yaegi 还支持沙箱环境运行代码,避免了潜在安全风险。... Yaegi 设计实现,主要包含以下几个方面的内容,仅供参考: 1. 词法分析器:Yaegi 首先需要将输入 Go 代码转化为词法单元,这个过程称为词法分析。...词法分析器会将输入 Go 代码分解为各种不同类型词法单元,例如关键字、标识符、字面量和运算符等。 2. 语法分析器:Yaegi 将词法单元转化为语法树,这个过程称为语法分析。...它还可以作为 Go 语言脚本引擎使用实现动态配置和扩展,同时可以沙箱环境运行代码,保证了应用程序安全性。 Adiós !

    1.7K51

    从编译器角度出发探索如何在go实现AOP

    但是,golang实现了自举,(自举 Bootstrapping,“用要编译目标编程语言编写其编译器(或汇编器)”),自举支持使用更为高级、提供更多高级抽象语言来编写编译器,意味着我们可以直接修改go...)return p.fileOrNil(), p.first}词法分析器其实是p.next()调用。...scanner, go因为词法分析器嵌套到了语法分析器,所以词法分析和语法分析是一起进行。...类型检查和AST转换解析完之后就是类型检查和AST转换了,简单讲就是会对构建好ast树进行遍历,每个节点上都会对当前子树类型进行验证,所有的类型错误和匹配都会在这个阶段被暴露出来,其中包括:结构体对接口实现.../golang-typecheck//如何实现aop在上面主要介绍了go编译器词法分析和语法分析之后,实现aop方案是显而易见,我们可以cmd/compile/internal/gc.parseFiles

    1.4K30

    golang源码分析(18)添加一个新语句到Golang编译器内部

    查看src/cmd/compileREADME文件,以获得编译步骤详细分步说明,该文件是这篇文章好伴侣。 词法分析器 扫描器(也称为词法分析器)将源代码文本分解为编译器离散实体。...词法分析器syntax包实现,我们需要做只是使它理解一个新关键字-until。...然而,Go这种情况将来可能会改变。Golang编译器最初是用C语言编写,后来自动翻译成Golang,所以编译器部分代码是C时代遗留下来,另外一部分则是较新。...顺便说一下,这也是我们可以通过将它重写为编译器已经知道如何处理AST节点来“实现”我们until语句地方。...我们已经Go编译器成功实现了一个新语句。我们没有覆盖编译器所有部分,因为我们采取了一个捷径,通过使用for节点去替换until节点AST。

    32830

    Golang高效实践之泛谈篇

    前言 我博客之前Golang高效实践系列博客已经系统介绍了Golang一些高效实践建议,例如:《Golang高效实践之interface、reflection、json实践》、《Golang 高效实践之...7.Go和C一样是用分号作为语句结束标记,不同是Go是词法分析器自动加上去,不用程序员手动添加。...i < f() { g() } 开括号‘{’要放在‘)’后面,否则词法分析器会自动‘)’末尾添加分到导致语法错误。...Go函数返回值可以像输入函数一样命名(当然也可以命名),命名返回值函数开始时就已经被初始化为类型零值。如果函数执行return没有带返回值,那么命名函数的当前值就会被返回。...所有格式输出相关函数fmt包,例如:fmt.Printf,fmt.Fprintf,fmt.Sprintf等等。

    45220

    TiDB SQL Parser 实现

    SparkSQL解析就是使用了ANTLR。Lex & Yacc 相对显得有些古老,实现不是那么优雅,不过我们也不需要非常深入学习,只要能看懂语法定义文件,了解生成解析器是如何工作就够了。...我们可以从一个简单例子开始: 上图描述了使用Lex & Yacc构建编译器流程。Lex根据用户定义patterns生成词法分析器。...词法分析器读取源代码,根据patterns将源代码转换成tokens输出。Yacc根据用户定义语法规则生成语法分析器。语法分析器词法分析器输出tokens作为输入,根据语法规则创建出语法树。...我们可以使用 position 形式访问堆栈项,1引用是第一项,2引用是第二项,以此类推。 上面例子语法规则关联动作,完成语法解析同时,也完成了表达式求值。...,而是纯手工打造,词法分析器对应代码是 parser/lexer.go, 它实现了 goyacc 要求接口: ... // Scanner implements the yyLexer interface

    51210

    TiDB 源码阅读系列文章(五)TiDB SQL Parser 实现

    Golang 版,所以要想看懂语法规则定义文件 parser.y,了解解析器是如何工作,先要对 Lex & Yacc 有些了解。...Lex & Yacc 介绍 Lex & Yacc 是用来生成词法分析器和语法分析器工具,它们出现简化了编译器编写。...Lex & Yacc 相对显得有些古老,实现不是那么优雅,不过我们也不需要非常深入学习,只要能看懂语法定义文件,了解生成解析器是如何工作就够了。...我们可以从一个简单例子开始: [1240] 上图描述了使用 Lex & Yacc 构建编译器流程。Lex 根据用户定义 patterns 生成词法分析器。...工具生成词法分析器,而是纯手工打造,词法分析器对应代码是 parser/lexer.go, 它实现了 goyacc 要求接口: ... // Scanner implements the yyLexer

    4.6K100

    LR分析shiftreduce reducereduce冲突解决方案SLR(1)与LR(1)

    LR(0)分析法简述 LR分析法从左至右移进输入终结符(词法分析器输出实际是token,但在语法分析阶段会代表是一个终结符),并将终结符压入到堆栈,称为shift。...因为这两种冲突存在导致了LR(0)分析法实际语法分析基本不可用,必须找到解决这两种冲突方案才行,那么如何这两种冲突呢? 3....SLR(1)分析法首先求出所有非终结符Follow Set,即 跟在非终结符之后所有终结符集合,然后前瞻一个符号(即从词法分析器预先读入下一个终结符),如果该前瞻符号一个非终结符Follow...Merak 我将LR(1)分析算法封装成了一个Golang Parser库:Merak,并且用它实现了一个面向对象语言Parser: Mizar。...对此有兴趣同学可以试用下,它将为你省略手写语法分析器过程,节省宝贵时间投入到更加有趣编译器后端工作

    12110

    【JS】547- 200行JS代码,带你实现代码编译器(人人都能学会)

    三、编译器实现 本文将通过 「The Super Tiny Compiler[3]」 源码解读,学习如何实现一个轻量编译器,最终「实现将下面原始代码字符串(Lisp 风格函数调用)编译成 JavaScript...,我们定义「词法分析器方法」 tokenizer 和「语法分析器方法」 parser 然后分别实现: // 词法分析器 参数:原始代码字符串 input function tokenizer(input...遍历过程,匹配每种字符并处理成「词法单元」压入「词法单元数组」,如当匹配到左括号( ( )时,将往「词法单元数组(tokens)「压入一个」词法单元对象」({type: 'paren', value...,定义了转换器 transformer 函数,使用词法分析器返回 LISP AST 对象作为参数,将 AST 对象转换成一个新 AST 对象。...,包括「词法分析器」、「语法分析器」、「遍历器」和「转换器」基本实现,最后通过「代码生成器」,将各个阶段代码结合起来,实现了这个号称「可能是有史以来最小编译器。」

    2.6K40

    Antlr4实战:统一SQL路由多引擎

    比如使用ANTLR解析大量Java源文件,生成语法树情况下,比手写javac分析器更快。...一条数据库SQL执行或实现过程大致是这样实现词法文件.g4(如antlr写词法文件的话),生成词法分析器和语法分析器,生成抽象语法树,再遍历抽象语法树,生成语义树,访问统计信息,优化器生成逻辑执行计划...位于花括号文本块,识别器根据它们语法位置,不同时机触发它。...两者唯一区别:有时,语法分析器引入tokens词法分析器没有发现,通常这是一个bug 实现访问器模式 继承HiveSqlBaseBaseVisitor返回类型为String类型...4)实现访问器遍历原HSQL生成转换目标语法如Presto逻辑,作为翻译器返回结果。 这些实现过程因为函数转换,不同语句转换,调换,裁剪,增加等等逻辑都是访问器模式遍历语法树过程实现

    9.5K41

    技术分享:杂谈如何绕过WAF(Web应用防火墙)

    比如: SQL:sEleCt vERsIoN(); ‍‍XSS:alert(1) 出现原因:waf里,使用正则不完善或者是没有用大小写转换函数 二:干扰字符污染法:...那就是webkit, 既然要说到webkit,那就不得不提webkit下解析器——词法分析器,因为我们绕过时候,就是利用解析器词法分析器来完成。...Webkit里词法分析器里除了跳过换行符,还会跳过什么字符呢? 子曰:还有回车等分隔符。 根据webkit词法分析器机制,我们就可以写更多猥琐xss代码。...--这个不可以弹窗--> 因为webkit词法分析器里,跳过回车、换行等分隔符时有个前提,那就是必须用单/双引号围住,不然不会跳过。...因为如果不使用引号,词法分析器会认为 回车、换行就是结束了,如果你运行上面这段代码,webkit会把java当做地址传给src。词法分析器跳过前提就是建立引号里,切记。

    4.3K60

    【图文详解】200行JS代码,带你实现代码编译器(人人都能学会)

    三、编译器实现 本文将通过 The Super Tiny Compiler 源码解读,学习如何实现一个轻量编译器,最终实现将下面原始代码字符串(Lisp 风格函数调用)编译成 JavaScript 可执行代码...,我们定义词法分析器方法 tokenizer  和语法分析器方法 parser 然后分别实现: // 词法分析器 参数:原始代码字符串 input function tokenizer(input)...遍历过程,匹配每种字符并处理成词法单元压入词法单元数组,如当匹配到左括号( ( )时,将往词法单元数组(tokens)压入一个词法单元对象({type: 'paren', value:'('})。...,定义了转换器 transformer 函数,使用词法分析器返回 LISP AST 对象作为参数,将 AST 对象转换成一个新 AST 对象。...,包括词法分析器、语法分析器、遍历器和转换器基本实现,最后通过代码生成器,将各个阶段代码结合起来,实现了这个号称可能是有史以来最小编译器。

    3.1K00

    走进Golang之编译器原理

    图中重要地方我都进行了注释,不过这里还是有几句话多说一下,我们看着上面的代码想象一下,如果要我们自己来实现这个“翻译工作”,程序要如何识别 Token 呢?...当然也有很多通过正则方式实现比较通用词法分析器,像 Golang 早期就用是 lex,在后面的版本才改用了用go来自己实现。...语法分析 经过词法分析后,我们拿到就是 Token 序列,它将作为语法分析器输入。然后经过处理后生成 AST 结构作为输出。...中间码也是有多种格式,像 Golang 使用就是SSA特性中间码(IR),这种形式中间码,最重要一个特性就是最使用变量之前总是定义变量,并且每个变量只分配一次。...代码优化 go编译文档,我并没找到独立一步进行代码优化。不过根据我们上面的分析,可以看到其实代码优化过程遍布编译器每一个阶段。大家都会力所能及做些事情。

    1.5K20

    编译器架构 ( Compiler Architecture )

    C语言编译器有很多种,不同平台下有不同编译器,例如: Windows 下常用是微软编译器(cl.exr),它被集成 Visual Studio 或 Visual C++ ,一般不单独使用;...你代码语法正确与否,编译器说了才算,我们学习C语言,从某种意义上说就是学习如何使用编译器,让编译器生成可执行程序(例如 Windows 下 .exe 程序)。...此外,语义分析器跟踪标识符、它们类型和表达式;标识符是否使用前声明等。语义分析器生成带注释语法树作为输出。...词法分析是编译器第一个阶段。它从以句子形式编写语言预处理器获取经过修改源代码。词法分析器通过删除源代码任何空格或注释,将这些语法分解为一系列标记。...如果词法分析器发现标记无效,它将生成一个错误。词法分析器与语法分析器密切合作。它从源代码读取字符流,检查合法令牌,并在需要时将数据传递给语法分析器。 ?

    1.7K20

    Go语言如何自定义linter(静态检查工具)

    前言 哈喽,大家好,我是asong; 通常我们在业务项目中会借助使用静态代码检查工具来保证代码质量,通过静态代码检查工具我们可以提前发现一些问题,比如变量未定义、类型匹配、变量作用域问题、数组下标越界...、内存泄露等问题,工具会按照自己规则进行问题严重等级划分,给出不同标识和提示,静态代码检查助我们尽早发现问题,Go语言中常用静态代码检查工具有golang-lint、golint,这些工具已经制定好了一些规则...,虽然已经可以满足大多数场景,但是有些时候我们会遇到针对特殊场景来做一些定制化规则需求,所以本文我们一起来学习一下如何自定义linter需求; Go语言中静态检查是如何实现?...集成到golang-cli 我们可以把golang-cli代码下载到本地,然后pkg/golinters 下添加firstparamcontext.go,代码如下: import ( "golang.org...可执行文件,加到我们项目中就可以了; 总结 golang-cli仓库pkg/golinters目录下存放了很多静态检查代码,学会一个知识点最快办法就是抄代码,先学会怎么使用,慢慢再把它变成我们自己

    1.3K30

    自制计算器——《自制编程语言》二

    《自制计算器(借助yacc和lex)—《自制编程语言》一》 本文介绍下不用yacc和lex实现过程,其实就是自己编写词法解析器和词法分析器来代替yacc和lex。...基于C语言实现 文中代码为了说明大多是截图,可以对照行号介绍,不过不用担心,源代码我都传到这里了 1.自制词法分析器 说明:本计算器会将换行作为分隔符,把输入分割成一个个算式。...根据上面的说明,词法分析器提供一下两个函数: // 将接下来要解析行置入词法分析器 void set_line(char *line); /* * 从被置入,分割记号并返回 * 在行尾会返回...词法分析器代码如下图: lexicalanalyzer.c ? ?     词法分析器运行机制为,每传入一行字符串,就会调用一次get_token()并返回分隔号记号。...比如在Pascal,goto语句使用标签只能是数字,这样限制原因是,如果像C语言一样允许英文字母作为标识符的话,读入第一个记号时就没办法区分这个记号究竟是赋值语句一部分,还是标签语句一部分。

    1.6K20

    如何编写一个 Python 词法分析器

    词法分析器 Python 解释器扮演着重要角色,它负责将源代码转换为计算机可以理解形式。...Python 词法分析器实现。您可以参考 Python 标准库 tokenize 模块,它是一个用 Python 实现词法分析器。Python 词法分析器性能。...如果您希望您词法分析器能够处理大规模 Python 代码,那么您需要考虑如何优化其性能。2. 解决方案编写 Python 词法分析器过程很复杂,需要考虑因素很多。...以下是一些可以帮助您编写 Python 词法分析器资源:Python 词法分析器完整规范Python 标准库 tokenize 模块如何编写一个 Python 词法分析器教程如果您在编写 Python...词法分析器时遇到任何问题,可以随时 Stack Overflow 或其他在线论坛上寻求帮助。

    15010
    领券