- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的任务涉及我学习语法(BNF 形式)并创建词法扫描器(使用 lex)和解析器(使用 bison)。我从来没有使用过这些程序中的任何一个,我认为一个很好的引用是查看这些项目是如何从语法创建的。我正在寻找一种语法及其关联的 .l 和 .ypp 文件,最好是在 C++ 中。我已经能够找到示例文件或示例语法,但不能同时找到它们。我花了一些时间搜索,但找不到任何东西。我想我会在这里发帖,希望有人能帮我找到一些东西,但同时我会继续搜索。
我目前正在阅读 Tom Niemann 的 http://epaperpress.com/lexandyacc/download/LexAndYaccTutorial.pdf这似乎写得很好并且可以理解。
谢谢
编辑:我仍在搜索,我开始认为我正在寻找的东西不存在。 Google 通常不会让我失望!
编辑 2:也许如果我提供一些语法,你们可以告诉我合适的 .l 和 .ypp 文件是什么样子的。这只是语法的一个片段,我只需要稍微“尝一尝”它是如何工作的,我想我可以从那里得到它。
语法:
Program ::= Compound
Statements ::= Compound | Assignment | ...
Assignment ::= Var ASSIGN Expression
Expression ::= Var | Operator Expression Expression | Number
Compound := START Statements END
Number ::= NUMBER
说明:
Assignment is the equal sign ":="
Var is an identifier that begins with a lower case letter and is followed by lower case letters or digits
START is the "start" keyword
END is the "end keyword
Operator is "+", "-", "*", "/"
Number is decimal digits which could potentially be negative (minus sign in front)
最佳答案
其中大部分都相当简单。然而,有一部分确实有问题。您已经定义了一个数字(可能)包含一个前导 -
,这是一个问题。
问题很简单。给定像 321-123
这样的输入,词法分析器(通常不会跟踪当前状态)基本上不可能猜测这是否应该是两个标记(321
和 -123
或三个 321
、-
、123
)。在这种情况下,-
几乎肯定是要与 123
分开,但是如果输入是 321 + -123
显然希望 -123
作为单个标记。
为了解决这个问题,您可能想要更改您的语法,以便前导-
不是数字的一部分。相反,您总是希望将 -
视为运算符,而数字本身仅由数字组成。然后由解析器对 -
是一元还是二进制的表达式进行分类。
考虑到这一点,词法分析器文件看起来像这样:
%{
#include "y.tab.h"
%}
%option noyywrap case-insensitive
%%
:= { return ASSIGN; }
start { return START; }
end { return END; }
[+/*] { return OPERATOR; }
- { return MINUS; }
[0-9]+ { return NUMBER; }
[a-z][a-z0-9]* { return VAR; }
[ \r\n] { ; }
%%
void yyerror(char const *s) { fputs(s, stderr); }
匹配的 yacc 文件看起来像这样:
%token ASSIGN START END OPERATOR MINUS NUMBER VAR
%left '-' '+' '*' '/'
%%
program : compound
statement : compound
| assignment
;
assignment : VAR ASSIGN expression
;
statements :
| statements statement
;
expression : VAR
| expression OPERATOR expression
| expression MINUS expression
| value
;
value: NUMBER
| MINUS NUMBER
;
compound : START statements END
%%
int main() {
yyparse();
return 0;
}
注意:我只对这些进行了最低限度的极度测试——足以验证我认为符合语法的输入,例如:start a:=1 b:=2 end
和 start a:=1+3*3 b:=a+4 c:=b*3 end
被接受(没有打印出错误消息)并且输入我认为是不符合语法的,例如as: 9:=13
和 a=13
do 都打印出 syntax error
消息。由于除了识别符合语法或不符合语法的表达式之外,这不会尝试对表达式做更多的事情,所以这大概是我们能做的最好的事情了。
关于c++ - Lex/Yacc 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23586193/
在此处回答的另一个问题中,我发现了以下 JavaScript代码: function _dom_trackActiveElement(evt) { if (evt && evt.target)
if (A == 0) OR (B == 0) 怎么说? 最佳答案 只是为了讽刺: if (A === 0 || B === 0) 关于语法,我们在Stack Overflow上找到一个类似的问题:
var ret = [] ,xresult = document.evaluate(exp, rootEl, null, X
我一直在寻找一些类似于下例的 JavaScript。有人可以解释一下吗,因为我以前从未见过这样编写的 JavaScript。 “SomethingHere”和冒号代表什么?我习惯于看到函数 myFun
这是我的程序: delimiter // drop procedure if exists migContactToActor; create procedure migContactToActor(
我遇到了一个问题。我一直在使用 gcc 编译/汇编我的 C 代码一段时间,并且习惯了阅读 Intel 汇编语法。我在生成程序集文件时使用了 -masm=intel 标志。 但是最近因为公司迁移,拿到了
自上而下和自下而上语法有什么区别?举个例子就太好了。 最佳答案 首先,语法本身不是自上而下或自下而上的,解析器是(尽管有些语法可以被其中一个解析,但不能被另一个解析)。 从实践的角度来看,主要区别在于
我知道这是草率的代码,但它是: display dialog ("Start Screensaver. Please type: matrix, coffee, waffles, star, wate
这个问题已经有答案了: Giving name to a loop (6 个回答) 已关闭 8 年前。 我见过这个字符在 C# 中使用,就像 Java 中的扩展一样,但最近我在代码中发现了这个 loo
我正在尝试编写一个函数来检查字符串是否为回文,但我认为在使用字符串指针时存在一些错误。这段代码有什么问题? #include #include #define MAX 1000 int IsPalin
所以在this question我询问了一些 Javascript 是如何被压缩的。问题已得到解答,但以下片段让我非常困惑,以至于我不得不问另一个问题。在这里: for (Y = 0; $ = 'zx
假设我有一个接受这些参数的函数。 int create(Ptr * p,void * (*insert)(void *, void *)) { //return something later } 结
这个问题已经有答案了: Bitwise '&' operator (6 个回答) 已关闭 5 年前。 我在代码中找到了这个,但我从未遇到过像 & 这样的事情,仅 && if ((code & 1) =
我在处理继承类及其中的构造函数和方法的语法时遇到了问题。 我想实现一个类日期和一个子类 date_ISO,它们将按特定顺序设置给定的日、月、年,并通过一种方法将其写入字符串。我觉得我的基类日期工作正常
我正在尝试通过存储过程填充表,如下所示: SET @resultsCount = (SELECT COUNT(*) FROM tableA); SET @i = 0; WHILE @i THEN
谁能解释一下下面代码中的“<<”? mysql test<
刚刚开始学习 MySQL,这是一个菜鸟问题,也是我在 StackOverflow 上的第一个问题。 假设我有 12 个订单状态,我想从其中的 5 个中选择总计。我会使用: SELECT SUM(tot
我的编程背景是在学校学过一点Java。由于某些原因,JavaScript 语法往往让我感到困惑。下面的 JavaScript 代码是一种我不知道如何构成的语法模式: foo.ready = funct
我正在阅读 javascript 源代码,并且我以前没有编写过 javascript。我对它的一些语法感到困惑。 $(function () { window.onload=function
我什至不知道如何命名我想要的东西。那么让我举个例子来解释一下。 虽然火狐使用textContent,但其他浏览器支持innerText属性。顺便说一句,如果我使用了错误的术语,请纠正我。无论如何,到目
我是一名优秀的程序员,十分优秀!