EBNF代表Extended Backus-Naur Form或Extended Backus Normal Form。它是BNF的扩展,用于描述无上下文语法的语法,例如编程语言,文档格式或通信协议。它通过为运营商提供表达可选的,零个或多个以及一个或多个术语的出现来改进BNF。与BNF相比,这使得EBNF更具表现力和简洁性。
我如何编写一个语法来表达一组可以以任何顺序出现零次或一次的项目? 例如A B C 有效,A C 有效,C B A 有效,A A B 无效,A B A 无效。 ...
我正在使用 Python 中的 Lark 库进行早期步骤,我真的很期待用 EBNF 解析器替换许多糟糕的 if 语句..! 这里的任务是解释所写的时间...
如何使用 W3C EBNF-Notation 并生成解析器生成器?
在整个 RDF 规范中,EBNF-NOTATION XML 规范用于指定文档的语法。所以我想知道如何使用 Antlr/bison/yacc (也许我在这些工具中使用一些标志......
我有一个具有以下格式的处理器跟踪输出: 时间周期 PC Instr 解码指令 寄存器和存储器内容 905ns 86 00000e36 00a005b3 c.添加...
我有一个简单的 EBNF: ::= ::= int ( ) { } ::= 返回 ; ::= 我有一个简单的 EBNF: <program> ::= <function> <function> ::= int <id> ( ) { <statement> } <statement> ::= return <expr> ; <expr> ::= <int> 我正在编写纯 C 语言并针对 Linux(目前)。答案不必用 C 语言编写。 我有一个 Lexer,它只是索引源文件并创建 token 结构的链接列表。 token 仅携带 char* 和 size_t 以及引用下一个标记。这就是它的全部了。 struct Token { char *ndx; size_t length; struct Token *next; } Lexer仅用两个基本条件对源进行索引,遵循这两个基本条件来辨别 - 或区分 - 一个标记与另一个标记: 空格分隔标记 符号是记号 - ( ) [ ] { } ; ...等等 我开始使用的源文件如下所示: int main() { return 2; } 我正在尝试弄清楚如何从 EBNF 到与成员的 ProgramExpr - FunctionExpr 和 StatementExpr。由于我有代表源文件的标记,因此解析器需要解析这些标记 - 即发现它们是什么。根据产生式规则,解析器将构建一个抽象语法树(我也称之为ExpressionNode。) 如何从 EBNF 转到 Expression Node? 我想我会有一个类似的结构: struct ExprNode { enum ExprType { PROG, FUNC, IDNT, STMT, EXPR, INT_LIT } type; char *term; int pos; int line; struct ExprNode* left; struct ExprNode* right; }; 解析的程序顺序是什么?由于我的 EBNF 以 <program> 开头,我的第一个解析函数是在寻找 程序 - 即 <function> 吗?如果我们还没有 function,解析器是否会陷入寻找 函数? 当我问时,每个人都只是说“使用 ANTLR”。但我有一个问题,我想在开始使用别人的黑匣子之前了解如何解决它。 我读过 Nora Sandler 的文章,编写编译器。虽然一篇好文章,但似乎跳过了一些内容,我只是不明白。我还意识到我可能会混淆 Parser Generator 和 Parser Combinator。 附注- 有人推荐了龙书...它在我的必读清单上。 由于我的 EBNF 以 <program> 开头,这是我寻找程序的第一个解析函数 - 即 <function>? 是的,所以你可能有一个函数 look_for_a_program() 调用 look_for_a_function()。 如果我们还没有该函数,解析器是否会陷入寻找函数的过程? look_for_a_function()会更有趣。首先,它会期望关键字 int(即指向输入中文本“int”的 Token)。如果成功,它需要一个 <id>(指向输入中类似单词的文本的 Token)。依此类推,反映 EBNF 中 <function> 规则的结构。 (当它到达<statement>部分时,它不会寻找令牌,而是调用look_for_a_statement。)如果您可以成功识别规则末尾的右大括号,那么您可以创建一个 ExprNode 代表您刚刚识别的 <function>。 (处理错误是另一回事。) 这是一种特殊类型的解析器,称为“递归下降解析器”,您可以在网络上找到吨的帮助。 (非常粗略地说,ANTLR 是一个解析器生成器,它将采用您的 EBNF 并为您创建类似上述代码的内容。) 一些想法: 您可能希望向 Token 结构添加一个字段来传达词法分析器已识别的标记类型。 (例如,整数文字与类似单词的东西与标点符号)这并不是绝对必要的,但它会让解析器变得更容易。 left结构的right和ExprNode字段表明你的AST将是一个二叉树。这可能一开始会起作用,但最终(当您扩大 EBNF 时)您可能会希望允许任意数量的“子节点”。
我正在尝试学习将 EBNF 转换为 C# 代码。 示例:int = 我理解它的说法“这种数据类型(int)的变量(ident)接受(=)一个整数(expr),...
是否有一个 EBNF 铁路生成器可以创建更大的块,而不是每个语法生成一张图? 我已经尝试过 https://www.bottlecaps.de/rr/ui ,效果非常好:可以抓取 EBNF 语法...
我承认我的大学时光已经一去不复返了,我可能比我想象的还要生疏一些。 正在阅读此 EBNF: ::= '{' [{属性名称 | “属性名称”}:...
无法编写可以将 AST 转换为 Clojure 代码的解析器
鉴于以下示例“~a{b=1}&(a{b=1}|a{b=1})|a{b=1}|a{b=1}”我写了使用 Instaparse 下面的解析器 ((insta/解析器 ” S = (组|exp)+ 组='~'? <'(...
我有一个(Lark)语法,我认为应该是明确的,但根据 Lark 的版本,无法以某种方式解析: 进口云雀 语法 = r""" stmt:mov_stmt |
我正在尝试为这篇 Microsoft 文章中描述的 ebnf 语法生成一个 javascript 解析器。文章中指定的ebnf在我按照其编写的方式使用时不起作用,所以我尝试过
我正在尝试使用 Grako 和 Python 为 Cisco IOS 和 ASA 配置编写解析器。我正在尝试弄清楚如何在 EBNF 中表示“范围”关键字 - 例如,“描述”关键字
是否有任何开源项目可用于比较定义相同编程语言语法的两个不同 EBNF 规则? 例如(对于 Rust): 来自 Ferrocene Language Specification...
我对 PureData 中的对象记录有以下定义,我需要能够将其解析为我的通用 PdObject 结构: 描述: 定义一个对象 句法: #X obj [x_pos] [y_pos] [
为以下内容编写 EBNF 描述: A C switch 语句
我试图自己解决它并得出这个解决方案但我不知道它是否是正确的答案。如果错了 在此处输入图像描述 你能给我解释一下它是怎么写的吗?
为什么这个提神元气规则作为复合规则的一部分解析失败,单独使用却解析成功?
我正在尝试将多个 boost::spirit 解析规则组合成更大的复合规则,并具有以下代码: #define BOOST_SPIRIT_DEBUG #包括 #include...