标签: left-recursion

涉及大括号的语法

我正在尝试解决序言中的 DCG 语法并在一定程度上取得了成功,但我一直在评估涉及此类大括号的表达式。\nexpr( T, [\xe2\x80\x99(\xe2\x80\x99, 5, +, 4, \xe2\x80\x99)\xe2\x80\x99, *, 7], []),

\n\n
expr(Z) --> num(Z).\nexpr(Z) --> num(X), [+], expr(Y), {Z is X+Y}.\nexpr(Z) --> num(X), [-], expr(Y), {Z is X-Y}.\nexpr(Z) --> num(X), [*], expr(Y), {Z is X*Y}.\nnum(D) --> [D], {number(D)}.\n\neval(L, V, []) :- expr(V, L, []).\n
Run Code Online (Sandbox Code Playgroud)\n

prolog left-recursion dcg

3
推荐指数
1
解决办法
2672
查看次数

Prolog DCG:匹配链上的不同符号

我试图匹配一些句子(例如001 [0,0,1],(1 +(1/0))['(',1,+,'(',1,/,0,')' ,')'], 等等.

我已经让自己跟随小型DCG了.

g3 --> s3.
s3 --> e3.

e3 --> eAdd.
e3 --> eMin.
e3 --> eMul.
e3 --> eDiv.
e3 --> n3.

eAdd --> ['('],e3,['+'],e3,[')'].
eMin --> ['('],e3,['-'],e3,[')'].
eMul --> ['('],e3,['*'],e3,[')'].
eDiv --> ['('],e3,['/'],e3,[')'].


n3 --> d3.
n3 --> n3,d3.
d3 --> [0].
d3 --> [1].
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,它与使用 - ,*或/的句子不匹配,但它仅适用于使用+的递归句子.

例如:

phrase(g3,['(',1,'+','(',1,'+',1,')',')']).
Run Code Online (Sandbox Code Playgroud)

会工作,但是

phrase(g3,['(',1,'+','(',1,'/',1,')',')']).
Run Code Online (Sandbox Code Playgroud)

不行.

任何帮助将不胜感激,谢谢!

recursion prolog left-recursion dcg failure-slice

3
推荐指数
1
解决办法
108
查看次数

使用scala-parser-combinators进行递归定义

我一直在尝试使用scala-parser-combinator库构建一个SQL解析器,我已将其大大简化为以下代码。

class Expression
case class FalseExpr() extends Expression
case class TrueExpr() extends Expression
case class AndExpression(expr1: Expression, expr2: Expression) extends Expression

object SimpleSqlParser {
  def parse(sql: String): Try[Expression] = new SimpleSqlParser().parse(sql)
}

class SimpleSqlParser extends RegexParsers {
  def parse(sql: String): Try[_ <: Expression] = parseAll(expression, sql) match {
    case Success(matched,_) => scala.util.Success(matched)
    case Failure(msg,remaining) => scala.util.Failure(new Exception("Parser failed: "+msg + "remaining: "+ remaining.source.toString.drop(remaining.offset)))
    case Error(msg,_) => scala.util.Failure(new Exception(msg))
  }

  private def expression: Parser[_ <: Expression] =
    andExpr | falseExpr | …
Run Code Online (Sandbox Code Playgroud)

scala parser-combinators left-recursion

3
推荐指数
1
解决办法
851
查看次数

DCG和左递归

我正在尝试实现一个带有一组形式为{a,b,c,d}*的字符串的dcg.我遇到的问题是如果我有一个形式s的查询([a,c,b], []),它返回true,这是正确的答案但是当我有一个形式s([a,c,f],[])的查询时,它不返回一个答案,它用完了本地堆栈.

s --> [].
s --> s,num.
num --> [a].
num--> [b].
num--> [c].
num--> [d].
Run Code Online (Sandbox Code Playgroud)

prolog left-recursion dcg failure-slice

2
推荐指数
1
解决办法
1220
查看次数

相互左递归ANTLR 4

我很遗憾再问一个关于相互左递归的问题,我觉得我的情况是独一无二的,或者至少我无法弄清楚它是否与其他人的语法联系起来.我对comp sci世界有点新鲜(我在java中自学,这是我的目标语言,现在是ANTLR4)所以如果可能的话请用layperson术语描述,而不是CS主要术语.

我正在编写一个需要代数和符号衍生物的程序,当然这需要对事物进行解析,然后对树进行操作,但我甚至不会担心这一点,因为我认为ANTLR4支持直接左递归,但是显然它不是以某种方式.在输出中,它一直告诉我,我的方法[表达式]是相互遗留的,显然是不允许的......?我的问题:

1)有人可以解释左递归/相互和直接左递归之间的区别,如果有的话?

2)解释我的语法中是什么导致了这种递归烦恼,以及如何解决它?而且我不确定这是否是主题:

3)人们说关于替代品和标签替代品的事情(我认为他们的意思是#label符号).那个有什么用?

grammar MathProcessor;
@header {package utils;}
END: ';';
EQUALS: '=';
SIN: 'sin(';
COS: 'cos(';
TAN: 'tan(';
SEC: 'sec(';
CSC: 'csc(';
COT: 'cot(';
LN: 'ln(';
EPOW: 'pow(';
RPAREN: '(';
LPAREN: ')';
EXP: '^';
MULT: '*';
DIV: '/';
ADD: '+';
SUBT: '-';
VAR: ('a'..'z'|'A'..'Z');
INT: ('0'..'9')+;
mathobj: ((equation|expression) END) EOF;
equation: (expression '=' expression);

expression: 
((RPAREN|SIN|COS|TAN|SEC|CSC|COT|LN|EPOW) expression (RPAREN)) #parenOps
| (expression EXP expression) #exponent
| (expression (MULT|DIV) expression) #multiplyDivide 
| (expression (ADD|SUBT) expression) #addSubtract
| (VAR|INT) #varInt …
Run Code Online (Sandbox Code Playgroud)

java left-recursion antlr4

2
推荐指数
1
解决办法
762
查看次数

Prolog dcg 从语言中生成所有单词

我正在尝试在 prolog 中编写一些 dcg 语法,它将描述
a^nb^n n>=0
"",ab,aabb,aaabbb itd

我写的都是

s --> slowo.
slowo --> [a],slowo,[b],!.
slowo --> [].  
Run Code Online (Sandbox Code Playgroud)

只要我想做的只是检查单词是否正确,它就很好,但是 dcg 语法应该如何在 prolog 中查找,以便?-phrase(s,X)从我的语言中生成所有单词?

prolog left-recursion dcg

1
推荐指数
1
解决办法
1074
查看次数

lambda calculus语法LLR

我正在尝试编写一个lambda演算解析器,我定义的语法似乎不在LLR中:

E ::= x | \x.E | EE | (E)
Run Code Online (Sandbox Code Playgroud)

我减少左递归:

E ::= xE' | \x.EE' | (E)E'
E'::= EE' | <empty>
Run Code Online (Sandbox Code Playgroud)

似乎不对,有人可以帮忙吗?

compiler-construction haskell lambda-calculus context-free-grammar left-recursion

0
推荐指数
1
解决办法
1132
查看次数