0

내가 람다 미적분 파서를 작성하는 것을 시도하고있다, 나는 정의 된 문법 LLR에없는 것 같다 람다 계산법 문법은 LLR

E ::= x | \x.E | EE | (E) 

내가 왼쪽 재귀 감소 :

E ::= xE' | \x.EE' | (E)E' 
E'::= EE' | <empty> 

를 잘 작성하지 것을, 아무도 도와 드릴 수 있습니까?

답변

5

"LLR"이란 무엇입니까? "LL", "LR", "LALR"을 의미합니까?

언어가 모호하기 때문에 언어에 포함되지 않습니다. 람다 미적분학에서이 모호성은 일반적으로 람다 식 \x.E이 가능한 한 많이 오른쪽으로 확장된다고 가정하여 해결됩니다. 예를 들어 \x.xx\x.(xx)으로, (\x.x)x으로는 해석하지 않습니다.

왼쪽 재귀를 제거하면 LL 문법을 찾는 것처럼 보입니다. 그러나, 귀하의 문법은 여전히 ​​애매합니다 (원래의 문법은 위 참조). 이 문제를 먼저 해결해야합니다. 더 이상 힌트 없습니다 ...

4

파섹에서 람다 식 파서의 구현 : 왼쪽 재귀가 또한 여기

+0

을 제거 파서의보다 간결 실용적 버전입니다 방법

import Text.Parsec import Text.Parsec.String data LambdaExpr = Variable Char | Abstraction Char LambdaExpr | Application LambdaExpr LambdaExpr deriving Show lambdaExprParser :: Parser LambdaExpr lambdaExprParser = do char '\\' var <- letter char '.' expr <- lambdaExprParser return $ Abstraction var expr <|> do apps <- many1 term return $ foldl1 Application apps term :: Parser LambdaExpr term = do var <- letter return $ Variable var <|> do char '(' expr <- lambdaExprParser char ')' return expr test = parseTest (do expr <- lambdaExprParser; eof; return expr) "\\y.y(\\x.x)y" 

주의 사항 : ** lambdaExprParser : **'추상화 <$> (문자 '\\'*> 편지 <* 문자 '.') <*> lambdaExprParser <|> foldl1 응용 프로그램 <$> many1의 term' ** 용어 : **'변수 <$> 문자 <|> char '('* 'lambdaExprParser <* char') '' –