使用 Flex 和 Bison 的简单 Java 语法

2024-02-04

我最近开始学习基本的 Flex 和 Bison,因为我必须为简单(但不是太简单)语法制作一个解析器。我决定在我的语法中制作一种简化的 Java 语言。我做了.l.y文件和所有内容都编译没有错误(我正在使用 gcc 进行编译)。 问题是每次我运行生成的程序时都会得到Syntax Error,即使有一个简单的输入,例如:private class Something{}。唯一一次我没有得到Syntax Error是当我输入一个空行时(\n)。 我已经为此苦苦挣扎了几天,我怀疑我的语法有问题,但我似乎找不到它。当然,可能还有其他问题,因为我对 Flex 和 Bison 还很陌生。

任何帮助将非常感激。

这里有.l and .y files:

java.l

%{
#include "java.tab.h"
%}

%option noyywrap

%%

"\n" return 0;
[ \t] ;

"private" {return PRIVATE;}
"public" {return PUBLIC;}
"protected" {return PROTECTED;}
"implenets" {return IMPLEMENTS;}
"extends" {return EXTENDS;}
"class" {return CLASS;}
"interface" {return INTERFACE;}
"if" {return IF;}
"while" {return WHILE;}
"return" {return RETURN;}
"true" {return BOOLEAN;}
"false" {return BOOLEAN;}

[A-z][a-z0-9]* {return NAME;}

"\""[A-z0-9]*"\"" {return STRING;}
"-"?[1-9][0-9]* {return INT;}

"+"|"-"|"*"|"/"|"="|"==" {return OPERATOR;}

%%

java.y

%{
#include <stdio.h>

int cond=0;
int loops=0;
int assigns=0;
int funcs=0;
int classes=0;

void yyerror(const char* msg){printf("Error: %s\n", msg);}
%}


%token PUBLIC
%token PRIVATE
%token PROTECTED
%token NAME
%token IMPLEMENTS
%token EXTENDS
%token CLASS
%token INTERFACE
%token IF
%token WHILE
%token STRING
%token BOOLEAN
%token OPERATOR
%token RETURN 
%token INT

%%

Code: Class Code | /*empty*/ {printf("classes: %d\n", classes); printf("functions: %d\n", funcs); printf("conditions: %d\n", cond); 
                                printf("loops: %d\n", loops); printf("assign operations: %d\n", assigns);} ;
Class: Modifier ClassType NAME Extra '{' Functions '}' ;
Modifier: PUBLIC | PRIVATE | PROTECTED ;
ClassType: CLASS | INTERFACE ;
Extra: IMPLEMENTS NAME | EXTENDS NAME | /*empty*/ ;
Functions: Function Functions | /*empty*/ ;
Function: Type NAME '(' Arguments ')' '{' Commands '}' {funcs++;} ;
Arguments: Argument Arguments | /*empty*/ ;
Argument: Type NAME Separator ;
Type: STRING | INT | BOOLEAN ;
Separator: ',' | /*empty*/ ;
Commands: Command Commands | /*empty*/ ;
Command: Condition | Loop | Assignment | Return ;
Condition: IF '(' Comparison ')' '{' Commands '}' {cond++;} ;
Loop: WHILE '(' Comparison ')' '{' Commands '}' {loops++;} ;
Comparison: NAME OPERATOR INT | NAME OPERATOR NAME | INT OPERATOR NAME ;
Assignment: NAME '=' Type ';' {assigns++;} ;
Return: RETURN RetVal ';' ;
RetVal: NAME | Type ;

%%

int main()
{
   yyparse();
   return 0;
}

这是一个开始:

首先,提供的默认规则flex只是回显与任何其他规则都不匹配的字符。{ and }没有任何规则匹配,因此它们将被回显并且永远不会被野牛看到,这使得生产无法进行Class匹配。一个简单的解决方案是将默认规则放在最后flex rule:

. { return yytext[0]; }

Second, [A-z]不等于[A-Za-z]因为Z and a在 ASCII 中不连续。我建议使用[[:alpha:]]对于字母字符和[[:alnum:]]对于字母数字,但没有什么问题[A-Za-z] and [A-Za-z0-9]。在这两种情况下,您可能希望允许其他字符,例如_。 (这不会给您带来任何直接问题,这只是一个注释。)

第三,你拼写了"implements"错误地。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Flex 和 Bison 的简单 Java 语法 的相关文章

随机推荐

  • 取消选择变量时,条形图“飞翔”

    我面临着 ggplot2 和plotly 的一些问题 使用 ggplot2 创建条形图并将其传递给函数时ggplotly取消选择变量时 条形图位于半空中 该图的表现与示例不同here https plot ly r bar charts 例
  • 多个 jediepcserver.py 用于多个 virtualenv

    我正在尝试为不同项目的多个 virtualenv 运行多个 jediepcserver py 我的想法是让我在 Emacs 上工作的每个项目都有适当的自动完成功能 例如 我目前正在开发两个项目 一个使用 Django 1 5 另一个使用 D
  • .Net AssemblyName.version 构建与修订

    MSDN 文档指出 版本号由二到四个组成 组件 主要 次要 构建和 修订 主要和次要 需要组件 构建和 修订组件是可选的 但是 构建组件是必需的 如果 修订版组件已定义 全部 定义的分量必须是整数 大于或等于0 版本号的格式如下 如下 显示
  • 从Python API而不是saved_model_cli中提取(或设置)输入/输出TF张量名称信息

    我使用 Keras TF2 5 训练了一个简单的模型并将其保存为已保存模型 tf saved model save my model path to model 如果我通过检查它 saved model cli show dir path
  • 使用 Amazon Cognito 访问 AWS Iot 时出现禁止异常

    我正在创建一个使用 Amazon Cognito 身份验证连接到 AWS IoT 的 Android 应用程序 我能够成功验证用户身份并且能够获取凭据 使用这些凭据更新事物影子时始终返回 403 禁止异常 我已尝试了所有方法来解决该问题 但
  • 如何在 mongodb 中更新多个数组元素

    我有一个 Mongo 文档 其中包含一个元素数组 我想重置 handled数组中所有对象的属性 其中 profile XX 该文件的形式如下 id ObjectId 4d2d8deff4e6c1d71fc29a07 user id 7146
  • plist 在字典中写入数据

    是否可以通过代码编辑捆绑包中的 pList 文件或资源中的值 这意味着我的 plist 文件不是以编程方式创建的 我想以编程方式编辑其值 在您的应用程序包中 不可以 您无法在应用程序包内写入文件 但是 您可以在应用程序首次启动时将该文件复制
  • Firebase - 如何使用前端 JS 隐藏令牌。安全性如何

    我正在使用 firebase 开发一个 web ap 我想使用 JS 直接从前端连接它 这样我就避免了中间层 所以我的问题基本上是如何使用 firebase 进行安全实现以及如何隐藏将在 Javascript 上公开的凭据 您永远不会在客户
  • 如何处理:ImportError: /usr/lib/x86_64-linux-gnu/libatk-1.0.so.0: undefined symbol: g_log_structed_standard

    我有一台 MacBook Pro 上面安装了 VirtualBox 安装了 Anaconda 来自https www continuum io https www continuum io 并安装了OpenCV conda install
  • CFNetwork 内部错误:URLConnectionLoader.cpp:289

    一段时间后 当我打开应用程序时 我收到日志 440 CFNetwork内部错误 0xc01a BuildRoot Library Caches com apple xbs Sources CFNetwork CFNetwork 758 4
  • Symfony Restful 帖子:JMSSerializerBundle 与 Symfony 表单组件

    据我了解 当控制器收到 post put patch 请求时 JMSSerializerBundle 的反序列化与 symfony 表单组件的反序列 化效果相同吗 因此 我要么创建一个 symfony 自定义 formType 例如一个 U
  • Qt GUI事件记录和回放

    我正在尝试实现一个简单 轻量级的系统来记录 Qt GUI 事件并从脚本中回放它们 我认为使用 Qt 事件系统的魔力这将是相当简单的 但我遇到了一个我不明白的问题 这是我正在做的事情的快速总结 记录 I use QApplication in
  • Perl 的首选单元测试框架是什么?

    我对 Perl 有点陌生 我想知道是否有首选的单元测试框架 谷歌向我展示了一些不错的结果 但由于我是新手 我不知道社区内是否有明确的偏好 Perl 附带了一整套很棒的测试工具 Perl 核心有数以万计的自动检查 并且大部分都使用这些标准 P
  • ActiveRecord::Base 上的 alias_method 导致 NameError

    我有一个直接继承自的模型ActiveResource Base 我正在尝试运行alias method对于记录表中的大多数列 但结果是 NameError 名称错误 未定义的方法address line 1 for class LeadIm
  • 如何使用 CSharp SQLite 加速 SQL 查询?

    背景 我有一个 SQLite3 数据库并且正在使用CSharp SQLite http code google com p csharp sqlite 来查询数据 我的问题是任何使用 JOIN 或 ORDER BY 调用的查询都非常慢 使用
  • JavaScript 中的instanceof 是如何工作的?

    在以下代码示例中 最后对 obj2 和 obj3 进行了检查实例化即使构造方式不同并且返回结果也返回 truename属性不同 var Obj1 function this name foo1 Obj1 prototype name foo
  • 将传单地图组合在一起

    我生成了这两个关于地理坐标的随机数据集 例如 每个点代表法国的一家假想餐厅 id 1 1000 long 2 2945 rnorm 1000 0 1085246 0 1 lat 48 8584 rnorm 1000 0 009036273
  • 3D 迷宫中的最短路径

    我正在尝试编写一个程序来使用递归查找 3D 迷宫中的最短路径 我能够编写找到穿过迷宫的随机路径的代码 但我想知道如何修改我的代码以找到最短路径 请注意 我想保留递归方法 有人可以提出解决方案吗 这是一个二维迷宫示例 s XXXX XX X
  • MVC 4 客户端验证不起作用

    谁能告诉我为什么客户端验证在我的 MVC 4 应用程序中不起作用 layout cshtml Scripts Render bundles jquery RenderSection scripts required false 在我的 we
  • 使用 Flex 和 Bison 的简单 Java 语法

    我最近开始学习基本的 Flex 和 Bison 因为我必须为简单 但不是太简单 语法制作一个解析器 我决定在我的语法中制作一种简化的 Java 语言 我做了 l和 y文件和所有内容都编译没有错误 我正在使用 gcc 进行编译 问题是每次我运