开发类似 python 的小型语言时的缩进控制

2024-05-05

我正在使用 flex、byacc(用于词法和解析)和 C++ 开发一种类似 python 的小型语言,但我有一些关于范围控制的问题。

就像 python 一样,它使用空格(或制表符)进行缩进,不仅如此,我还想实现索引中断,例如,如果您在另一个 while 循环内的 while 循环内键入“break 2”,它不仅会从最后一个,但也来自第一个循环(因此break后的数字为2),依此类推。

example:

while 1
    while 1
        break 2
        'hello world'!! #will never reach this. "!!" outputs with a newline
    end
    'hello world again'!! #also will never reach this. again "!!" used for cout
end
#after break 2 it would jump right here

但由于我没有“反”制表符来检查作用域何时结束(例如 C,我只会使用“}”字符),我想知道这种方法是否是最好的:

我将在 yacc 文件上定义一个全局变量,例如“int tabIndex”,我将使用 extern 在 lex 文件中访问该变量。然后每次我在 lex 文件上找到制表符时,我都会将该变量增加 1。在解析 yacc 文件时,如果我找到“break”关键字,我会减少从 tabIndex 变量中在其后面键入的金额,并且当编译后到达 EOF,得到 tabIndex != 0 我会输出编译错误。

现在的问题是,查看缩进是否减少的最佳方法是什么,我应该从 lex 读取 \b (退格)字符,然后减少 tabIndex 变量(当用户不使用break时)?

另一种方法来实现这一目标?

还有另一个小问题,我希望每个可执行文件都在名为 start() 的函数上有其起点,我应该将其硬编码到我的 yacc 文件中吗?

很抱歉问了这么长的问题,非常感谢任何帮助。另外,如果有人可以为 python 提供 yacc 文件作为指南,那就太好了(尝试在 Google 上查找,但没有运气)。

提前致谢。


我目前正在实现一种与此非常相似的编程语言(包括奇怪的多级中断)。我的解决方案是让标记生成器根据缩进发出缩进和缩进标记。例如:

while 1: # colons help :)
    print('foo')
    break 1

becomes:

["while", "1", ":",
    indent,
    "print", "(", "'foo'", ")",
    "break", "1",
    dedent]

但这使得分词器对 '\n' 的处理有些复杂。另外,我从头开始编写了分词器和解析器,所以我不确定这在 lex 和 yacc 中是否可行。

Edit:

半工作伪代码示例:

level = 0
levels = []
for c = getc():
    if c=='\n':
        emit('\n')
        n = 0
        while (c=getc())==' ':
            n += 1
        if n > level:
            emit(indent)
            push(levels,n)
        while n < level:
            emit(dedent)
            level = pop(levels)
            if level < n:
                error tokenize
        # fall through
    emit(c) #lazy example
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开发类似 python 的小型语言时的缩进控制 的相关文章

  • C++ 有像 Pascal 一样的“with”关键字吗?

    withPascal 中的关键字可用于快速访问记录的字段 有人知道 C 是否有类似的东西吗 前任 我有一个包含许多字段的指针 但我不想这样输入 if pointer gt field1 pointer gt field2 pointer g
  • .NET Windows 服务中调用 C# 的 wait 的 I/O 回调是否可以不阻塞?

    我知道在 ASP NET 中 当使用 wait 时工作线程会返回到池中 而 I O 发生在后台 这对于可扩展性非常有用 我的 Windows 服务是一个套接字服务器 它使用 Begin End 样式的异步套接字 I O 混合我的魔法 我知道
  • 在 MVC 类上创建主键字段

    我是 MVC 和 C 新手 我只是偶然发现它并发现它很有趣 我遇到了一个不允许我继续的问题 这是我的代码 using System using System Collections Generic using System Linq usi
  • 此插件导致 Outlook 启动缓慢

    我正在使用 C NET 4 5 开发 Outlook Addin 项目 但部署后 有时 Outlook 会禁用我的插件 并显示此消息 这个插件导致 Outlook 启动缓慢 我不知道我的插件出了什么问题 这只有很少的代码 并且ThisAdd
  • 浏览器收集哪些值作为回发数据?

    当页面被发送回服务器时 浏览器收集每个控件的当前值并将其粘贴到一个字符串中 然后 该回发数据通过 HTTP POST 发送回服务器 Q1 除了控件的 Text 属性和 SelectedIndexchanged 因此除了用户输入数据 之外 控
  • 如何检查 .NET 4.0 中的泛型参数是否是动态的

    我有课ObjectMapper
  • C# ConfigurationManager 从 app.config 检索错误的连接字符串

    我有一个简单的 WinForms 应用程序 它最终将成为一个游戏 现在 我正在研究它的数据访问层 但遇到了障碍 我创建了一个单独的项目 名为DataAccess在其中 我创建了一个本地 mdfSQL Server 数据库文件 我还创建了一个
  • 禁用除滚动之外的 DataGridView

    我如何配置 datagridview 以便用户只能在行中移动并使用滚动 而没有其他 如果我禁用网格不允许我使用滚动 将您的 datagridview 设置为只读 这将禁用任何编辑 dataGridView1 ReadOnly true 在你
  • 使用 Microsoft Graph 创建用户

    如何使用 Microsoft graph 创建用户 因为我在保存过程中遇到了权限失败的问题 我确实有几个问题 在图中调用创建用户 API 将在哪里创建用户 是在 Azure AD 还是其他地方 我尝试通过传递 json 和必需的标头来调用创
  • C++ 析构函数:何时释放内存?

    如果我删除一个导致其析构函数被调用的对象 那么内存是在析构函数完成函数中的任何操作之前还是之后被释放 仅当最小派生类子对象被销毁后才会释放内存 所以如果你有 class Base class Derived public Base publ
  • ASP MVC 5 - 403 customError 不起作用

    我正在尝试为我的应用程序创建自定义错误页面 它在大部分情况下都有效 但不适用于403 errors 我的网络配置
  • 从 ef core 的子集合中删除一些项目

    我有一个父表和子表 其中父表与子表具有一对多关系 我想删除一些子项 并且希望父项的子集合反映该更改 如果我使用删除选定的子项RemoveRange 那么子集合不会更新 如果我使用Remove从子集合中删除子集合然后 显然 它不如使用效率高R
  • 在 C# 中生成随机值

    如何使用以下命令生成随机 Int64 和 UInt64 值RandomC 中的类 这应该可以解决问题 这是一个扩展方法 因此您可以像调用普通方法一样调用它Next or NextDouble上的方法Random目的 public stati
  • 函数模板重载解析期间的 MSVC 与 Clang/GCC 错误,其中一个函数模板包含参数包

    当我使用参数包时 我注意到这样一种情况 如下所示 在 gcc 和 clang 中编译得很好 但在 msvc 中却不行 template
  • 如何在Linux上构建GLFW3项目?

    我已经使用 cmake 和 make 编译了 glfw3 和包含的示例 没有出现任何问题 开始编写我的第一个项目 作为 opengl 和 glfw 的新手 并且对 C 和 CMake 没有经验 我正在努力理解示例构建文件 甚至要链接哪些库和
  • 无效的模板相关成员函数模板推导 - 认为我正在尝试使用 std::set

    我有一个继承自基类模板的类模板 基类模板有一个数据成员和一个成员函数模板 我想从我的超类中调用它 我知道为了消除对成员函数模板的调用的歧义 我必须使用template关键字 我必须明确引用this在超级班里 this gt base mem
  • 网页执行回发时如何停止在注册表单上?

    我正在做我的最后一年的项目 其中 我在一页上有登录和注册表单 WebForm 当用户点击锚点时Sign Up下拉菜单ddlType 隐藏 和文本框 txtCustName txtEmail and txtConfirmPassword 显示
  • 请解释为什么Java和C对此代码给出不同的答案

    public class Test public static void main String args int i 10 i i System out println value of i is i 输出是 10 当我在中执行类似的代码
  • C# 中成员访问中的问号是什么意思?

    有人可以向我解释一下以下代码中会员访问中的问号是什么意思吗 它是标准 C 的一部分吗 尝试在 Xamarin Studio 中编译此文件时出现解析错误 this AnalyzerLoadFailed Invoke this new Anal
  • XmlDocument Save 使文件保持打开状态

    我有一个简单的 C 函数 可以创建一个基本的 XML 文件并保存 private void CreateXMlFile string Filename string Name string Company XmlDocument doc n

随机推荐

  • 在 Safari 中转换变换和大小 (9.1)

    我试图在元素上实现平滑过渡transform translate 和一些其他属性 是的 我读过有关匹配供应商前缀的内容 它在 Chrome 和 FF 中工作正常 但在 Safari 中它不能平滑地动画转换 在最后跳转 在应用翻译之前 它似乎
  • VBScript 中的对象/类字典

    vbscript 中是否可以有对象 类的字典 例如 Class employeeclass Public first last salary End Class Dim employeedict Set employeedict Creat
  • 使 Selenium 记录 ID,而不是路径

    当我使用FF插件时它记录了我与之交互的元素的路径 如果 DOM 根据用户交互而发生重大更改 元素ID更方便 保证不受影响 我可以记录所有内容并手动更改 ID 的路径 但我想知道是否有更聪明的方法来做到这一点 我认为没有办法做到这一点 根据我
  • 签名 URL 在过期日期后仍然有效

    我创建了一个签名 URL 有效期为 2 天 尽管过期 但它仍然有效 我希望它给出一些错误 3XX 4XX 测试脚本 https gist githubusercontent com forvaidya 984003008b0603ca679
  • 如何使用活动模型为 date_select 下拉菜单定义虚拟属性

    我在应用程序中使用活动模型进行付款流程 但我无法添加信用卡到期日期字段 因为它会引发如下错误未定义方法 card expiration date 3i 在我的模型中 class CartServer include ActiveModel
  • 哪些浏览器容易受到多个 x-frame-options 的影响

    我正在做一个网络应用程序测试 发现多个 x frame options 标头条目存在一些漏洞 哪些浏览器容易受到多个 x frame options 的攻击 Multiple x frame options 标头条目可能受到哪些攻击 点击劫
  • Spark:有没有办法打印出spark-shell和spark的类路径?

    我可以在 Spark shell 中成功运行 Spark 作业 但是当它打包并通过 Spark submit 运行时 我收到 NoSuchMethodError 这向我表明类路径存在某种不匹配 有没有办法可以比较两个类路径 某种日志记录语句
  • Netbeans 版本控制文件颜色代码?

    我试图找到一个图例来帮助解释 NetBeans 用于描述文件状态的不同颜色 我的一些文件颜色是 Grey Blue Green 还有其他我还没有发现的 如果有帮助 我将使用带有 CVS 的 Netbeans 6 7 这些颜色是什么 绿色意味
  • 如何调试VS2010安装工程?

    如何调试VS2010安装工程 我尝试附加到 msiexec exe 但没 有帮助 我假设您想在安装程序中调试自定义操作 如果是这样 请在运行安装程序时打开解决方案 并将此行代码放在其中一个事件中 System Diagnostics Deb
  • 无法验证主机真实性

    我第一次做git pull 在git中提示无法确定主机的真实性 与我生成的私钥相比 RSA密钥指纹不正确 我只是想知道如何更新它以便它读取正确的文件以及为什么它首先读取错误的指纹 我遇到了类似的问题 这意味着远程主机未知 不受信任 修复方法
  • 如何将div附加到其他div中

    我想在 mytext div 中附加 div 但它正在更新 div 外部的文本 jj 指 body 元素 function var mydiv div min div
  • Apache mod_rewrite 内部到不同的端口

    是否可以使用 mod rewrite 内部重定向 因此地址栏中的 url 不会更改 到同一主机上的不同端口 例如 http host com 8080 gt http host com 9999 myapplication param va
  • 构建可扩展 Web 应用程序的书籍? (数据库性能/调优、网络、一般性能等)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 从计算机科学专业毕业并作为一名从事 Web 应用程序的软件工程师进入 现实世界 后 我对如何正确扩展 W
  • Sonarqube如何正确配置gradle子项目?

    我的 gradle 项目结构如下所示 geode core geode lucene extensions geode modules extensions geode modules session For extensions因此 子项
  • 从有序结果集中查找“运行”行

    我试图找出一种方法来识别满足某些条件的 运行 结果 按顺序连续行 目前 我正在订购结果集 并通过眼睛扫描特定模式 这是一个例子 SELECT the date name FROM orders WHERE the date BETWEEN
  • 了解 Mac 上的 Oracle Java

    我在 OS X 上使用 Java 很多很多年了 最近当 Apple 停止默认包含 Java 时 我放弃了操作系统并为我安装了它 当然是 Apple 的版本 现在我使用的是 OS X 10 8 并且需要安装 Java 7 因此我刚刚获得了 D
  • 如何在 Express 4.0 中发送 Flash 消息?

    因此 我的 Web 应用程序需要身份验证 并且我有一个注册页面 如果用户尝试使用数据库中已有的电子邮件进行注册 我想向他们显示一条错误消息 我正在尝试在 html 端使用此代码来执行此操作 div class alert alert dan
  • 如何将 BufferedImage 转换/转换为图像?

    我想转换一个BufferedImage to an java awt Image 我的源图像是 tif 所以我使用 JAI 将其读取为PlanarImage PlanarImage 源 JAI create 文件加载 IMG DIR tag
  • 单选按钮列表 OnSelectedIndexChanged

    我正在寻找处理 ASP net RadioButtonList 后面的 C 代码 上选择的索引更改的最佳方法 我有 3 个列表项 对于第一个 我希望它在页面上显示隐藏的 asp textbox 而其他 2 个将隐藏文本框 asp net s
  • 开发类似 python 的小型语言时的缩进控制

    我正在使用 flex byacc 用于词法和解析 和 C 开发一种类似 python 的小型语言 但我有一些关于范围控制的问题 就像 python 一样 它使用空格 或制表符 进行缩进 不仅如此 我还想实现索引中断 例如 如果您在另一个 w