考虑以下BNF语法(其中非终端包含在尖括号中并<identifier>
与任何合法的Java变量标识符匹配).
<exp> ::= <exp> + <term>
| <exp> - <term>
| <term>
<term> ::= <term> * <factor>
| <term> / <factor>
| <factor>
<factor> ::= ( <exp> )
| <identifier>
Run Code Online (Sandbox Code Playgroud)
为以下表达式生成三个派生:
(x - a) * (y + b)
Run Code Online (Sandbox Code Playgroud)
盯着exp:
<exp>
Run Code Online (Sandbox Code Playgroud)
用术语替换exp:
<term>
Run Code Online (Sandbox Code Playgroud)
替换术语:
<term> * <factor>
Run Code Online (Sandbox Code Playgroud)
用因子代替术语:
<factor> * <factor>
Run Code Online (Sandbox Code Playgroud)
用(exp)替换这两个因子:
( <exp> ) * ( <exp> )
Run Code Online (Sandbox Code Playgroud)
用exp - term替换第一个exp,用exp + term替换第二个exp
( <exp> - <term> ) * ( <exp> + <term> )
Run Code Online (Sandbox Code Playgroud)
将exp替换为term,然后用因子替换所有4个术语.
( <factor> - …
Run Code Online (Sandbox Code Playgroud) 以图的形式构造确定性有限自动机的规则是什么?我的教授通过例子解释,但我不确定所有图表必须遵循哪些规则.任何帮助表示赞赏,谢谢!
以下代码:
<?php//comment
error_reporting(0);
Run Code Online (Sandbox Code Playgroud)
结果(至少在5.2.11中):
解析错误:语法错误,意外T_STRING
......我觉得很奇怪.
是否<?php//comment
应该逐字允许,我建议对于解析错误内容的无效性毫无疑问.
那是因为没有T_STRING
看见(虽然我确实知道制作可能形成其他制作以灌输优先权,例如additive-expression
s封装乘法运算等).
任何了解PHP语法的人都可以解释这是如何产生的吗?
以下是一个简单的c ++程序,它使用我的MinGW编译器进行编译,并按预期执行:
#include <iostream>
template <class T> class A {
T a;
template <class U> friend class B;
public:
A<T> (T t) : a(t) {}
};
template <class T> class B {
A<T> aa;
public:
B<T> (T t) : aa(t) {}
T getT() const {return aa.a;}
};
int main() {
B<int> b(5);
std::cout << "> " << b.getT() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
由于B<T>::getT()
访问私有 A<T>::a
成员,A<T>
使得B<T>
与朋友template <class U> friend class B;
一行.
不幸的是,我不知道为什么 …
我正在尝试为处理lambda演算的语言编写一个小编译器.以下是我发现的语言含糊不清的定义:
E ? ^ v . E | E E | ( E ) | v
Run Code Online (Sandbox Code Playgroud)
符号^,.,(,)和v是标记.^表示lambda,v表示变量.形式^ vE的表达式是函数定义,其中v是函数的形式参数,E是其主体.如果f和g是lambda表达式,则lambda表达式fg表示函数f应用于参数g.
在假设函数应用程序是左关联的情况下,我试图为这种语言编写一个明确的语法,例如fgh =(fg)h,并且该函数应用程序比...更严格地绑定,例如(^ x.^ y. xy)^ zz =(^ x.(^ y.xy))^ zz
这是我到目前为止所做的,但我不确定它是否正确:
E -> ^v.E | T
T -> vF | (E) E
F -> v | epsilon
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
lambda grammar parsing programming-languages lambda-calculus
我刚接受了期中考试,但无法回答这个问题.
有人可以给出一些语言的例子,并为语言构建一个语法,或者 至少告诉我如何去做它?
另外如何编写语法L
:
L = {a n b m | n,m = 0,1,2,...,n <= 2m}?
提前致谢.
grammar context-free-grammar computation-theory context-sensitive-grammar
刚刚在Chrome中测试:
"\054321"
Run Code Online (Sandbox Code Playgroud)
进入控制台输入:
",321"
Run Code Online (Sandbox Code Playgroud)
显然"\054"
转换为","
,但我没有在规范中找到规则.
我正在寻找这条规则的正式规范.为什么"\054"
生产","
?
更新:这是一个OctalEscapeSequence
,如在限定的乙1.2.
我注意到这是一个有效的原型,同时阅读了Jeff Lee发布的1985年的ANSI C语法规范,并编写了一个带有此签名的函数.这个原型的功能究竟可以返回什么?这个函数的简单主体是什么样的?
请考虑以下语法。我在运算符优先级方面遇到问题,例如:res = 2 * a + b具有与res = 2 *(a + b)类似的解析树。我知道问题出在哪里,但是我想到没有相互左递归的“美丽”解决方案。你能帮我一下吗。语法与自定义访问者一起使用。
grammar Math;
expression: expression add=('+'|'-') expression # expressionAddExpression
| expression mult='*' expression # expressionMultExpression
|'(' expression ')' # bracketExpression
| number # numberExpression
;
number: INT #int
| '(' number ')' #bracketNumber
| VARIABLE #var
;
VARIABLE: [A-Za-z][A-Za-z0-9]*;
INT: [0-9]+;
Run Code Online (Sandbox Code Playgroud) ANSI C语法指定:
declarator:
pointer_opt direct-declarator
direct-declarator:
identifier
( declarator )
direct-declarator [ constant-expression_opt ]
direct-declarator ( parameter-type-list )
direct-declarator ( identifier-list_opt )
Run Code Online (Sandbox Code Playgroud)
根据这个语法,可以推导出来
func()()
Run Code Online (Sandbox Code Playgroud)
作为宣告者,和
int func()()
Run Code Online (Sandbox Code Playgroud)
作为声明,在语义上是非法的.为什么C语法允许这种语法上合法但非法的非法声明?