Конфликтов сдвиг / свёртка в пропозициональной логики синтаксического анализа в Happy

голоса
2

Я делаю простой пропозициональную логику анализатор на счастливом на основе этого BNF определения высказываний логической грамматики, это мой код

{
module FNC where
import Data.Char 
import System.IO
}

-- Parser name, token types and error function name:
--
%name parse Prop
%tokentype { Token } 
%error { parseError }

-- Token list:
%token
     var { TokenVar $$ }  -- alphabetic identifier
     or { TokenOr }
     and { TokenAnd }
     '¬' { TokenNot }
     => { TokenImp } -- Implication
     <=> { TokenDImp } --double implication
    '(' { TokenOB } --open bracket
    ')'  { TokenCB } --closing bracket
    '.' {TokenEnd}

%left <=>
%left =>
%left or
%left and
%left '¬'
%left '(' ')'
%%

--Grammar
Prop :: {Sentence}
Prop : Sentence '.' {$1}

Sentence :: {Sentence}
Sentence : AtomSent {Atom $1}
    | CompSent {Comp $1}

AtomSent :: {AtomSent}
AtomSent : var { Variable $1 }

CompSent :: {CompSent}
CompSent : '(' Sentence ')' { Bracket $2 }
    | Sentence Connective Sentence {Bin $2 $1 $3}
    | '¬' Sentence {Not $2}

Connective :: {Connective}
Connective : and {And}
    | or {Or}
    | => {Imp}
    | <=> {DImp}


{
--Error function
parseError :: [Token] -> a
parseError _ = error (parseError: Syntax analysis error.\n)

--Data types to represent the grammar
data Sentence
    = Atom AtomSent
    | Comp CompSent
    deriving Show

data AtomSent = Variable String deriving Show

data CompSent
      = Bin Connective Sentence Sentence
      | Not Sentence
      | Bracket Sentence
      deriving Show

data Connective
    = And
    | Or
    | Imp
    | DImp
    deriving Show

--Data types for the tokens
data Token
      = TokenVar String
      | TokenOr
      | TokenAnd
      | TokenNot
      | TokenImp
      | TokenDImp
      | TokenOB
      | TokenCB
      | TokenEnd
      deriving Show

--Lexer
lexer :: String -> [Token]
lexer [] = []  -- cadena vacia
lexer (c:cs)   -- cadena es un caracter, c, seguido de caracteres, cs.
      | isSpace c = lexer cs
      | isAlpha c = lexVar (c:cs)
      | isSymbol c = lexSym (c:cs)
      | c== '(' = TokenOB : lexer cs
      | c== ')' = TokenCB : lexer cs
      | c== '¬' = TokenNot : lexer cs --solved
      | c== '.'  = [TokenEnd]
      | otherwise = error lexer:  Token invalido

lexVar cs =
   case span isAlpha cs of
      (or,rest) -> TokenOr : lexer rest
      (and,rest)  -> TokenAnd : lexer rest
      (var,rest)   -> TokenVar var : lexer rest

lexSym cs =
    case span isSymbol cs of
        (=>,rest) -> TokenImp : lexer rest
        (<=>,rest) -> TokenDImp : lexer rest
}

Теперь у меня есть две проблемы здесь

  1. По какой-то причине я получаю 4 конфликтов сдвиг / свёртка, я не знаю, где они могли бы быть, так как я думал, что старшинство будет решать их (и я думаю, что я следовал за грамматику BNF правильно) ...
  2. (Это скорее проблема Haskell) На моей функции лексического анализатора, по какой-то причине я получаю разборе ошибки в строке, где я говорю, что делать с «¬», если я удалю эту линию он работает, почему это может быть? (Этот вопрос решается)

Любая помощь будет большой.

Задан 21/04/2013 в 20:49
источник пользователем
На других языках...                            


2 ответов

голоса
4

Если вы используете счастливы с -iним будет генерировать информационный файл. В этом файле перечислены все состояния , которые ваш парсер. Кроме того , будут перечислены все возможные переходы для каждого состояния. Вы можете использовать эту информацию , чтобы определить , является ли сдвиг / свертка конфликта является один вы заботитесь о.

Информация о вызове счастливых и конфликтов:

Ниже приведены некоторые из выхода -i. Я удалил все , кроме государственного 17. Вы хотите получить копию этого файла , так что вы можете правильно отладить эту проблему. То , что вы видите здесь только , чтобы помочь говорить об этом:

-----------------------------------------------------------------------------
Info file generated by Happy Version 1.18.10 from FNC.y
-----------------------------------------------------------------------------

state 17 contains 4 shift/reduce conflicts.

-----------------------------------------------------------------------------
Grammar
-----------------------------------------------------------------------------
    %start_parse -> Prop                               (0)
    Prop -> Sentence '.'                               (1)
    Sentence -> AtomSent                               (2)
    Sentence -> CompSent                               (3)
    AtomSent -> var                                    (4)
    CompSent -> '(' Sentence ')'                       (5)
    CompSent -> Sentence Connective Sentence           (6)
    CompSent -> '¬' Sentence                          (7)
    Connective -> and                                  (8)
    Connective -> or                                   (9)
    Connective -> "=>"                                 (10)
    Connective -> "<=>"                                (11)

-----------------------------------------------------------------------------
Terminals
-----------------------------------------------------------------------------
    var            { TokenVar $$ }
    or             { TokenOr }
    and            { TokenAnd }
    '¬'           { TokenNot }
    "=>"           { TokenImp }
    "<=>"          { TokenDImp }
    '('            { TokenOB }
    ')'            { TokenCB }
    '.'            { TokenEnd }

-----------------------------------------------------------------------------
Non-terminals
-----------------------------------------------------------------------------
    %start_parse    rule  0
    Prop            rule  1
    Sentence        rules 2, 3
    AtomSent        rule  4
    CompSent        rules 5, 6, 7
    Connective      rules 8, 9, 10, 11

-----------------------------------------------------------------------------
States
-----------------------------------------------------------------------------
State 17

    CompSent -> Sentence . Connective Sentence          (rule 6)
    CompSent -> Sentence Connective Sentence .          (rule 6)

    or             shift, and enter state 12
            (reduce using rule 6)

    and            shift, and enter state 13
            (reduce using rule 6)

    "=>"           shift, and enter state 14
            (reduce using rule 6)

    "<=>"          shift, and enter state 15
            (reduce using rule 6)

    ')'            reduce using rule 6
    '.'            reduce using rule 6

    Connective     goto state 11

-----------------------------------------------------------------------------
Grammar Totals
-----------------------------------------------------------------------------
Number of rules: 12
Number of terminals: 9
Number of non-terminals: 6
Number of states: 19

Это выход в основном говорит, что он работает в немного двусмысленности, когда он смотрит на связках. Оказывается, слайды вы связали упоминание этого (Слайд 11), «неясности разрешаются через старшинство ¬∧∨⇒⇔ или скобки».

На данный момент, я бы рекомендовал смотреть на сдвиг / свёртка и желаемые старшинство, чтобы увидеть, если анализатор вы должны делать правильные вещи. Если это так, то вы можете смело игнорировать предупреждения. Если нет, то у вас есть больше работы для себя.

Ответил 21/04/2013 в 23:09
источник пользователем

голоса
2

Я могу ответить на № 2:

| c== '¬' == TokenNot : lexer cs --problem here
--        ^^

У вас есть ==там , где вы должны иметь =.

Ответил 21/04/2013 в 21:02
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more