2017-09-30 10 views
0

Dans le cadre de mon projet, je suis supposé convertir EBNF en BNF et utiliser DCG pour programmer BNF dans SWI-Prolog.convertir EBNF à BNF et l'utiliser comme format DCG sur Prolog

EBNF est la suivante:

program -> int main () { declarations statements } 
declarations -> { declaration } 
declaration -> type identifier [ [digit] ] ; 
type -> int | bool | float | char 
statements -> { statement } 
statement -> ; | block | assignment | if_statement | while_statement 
block -> { statements } 
assignment -> identifier [ [digit] ] = expression ; 
if_statement -> if (expression) statement 
while_statement -> while (expression) statement 
expression -> conjunction { || conjunction } 
conjunction -> equality { && equality } 
equality -> relation [ equ_op relation ] 
equ_op -> == | != 
relation -> addition [ rel_op addition ] 
rel_op -> < | <= | > | >= 
addition -> term { add_op term } 
add_op -> + | - 
term -> factor { mul_op factor } 
mul_op -> * |/| % 
factor -> [ unary_op ] primary 
unary_op -> - | ! 
primary -> identifier [ [digit] ] | literal | (expression) | type ( 
expression) 
literal --> digit | boolean 
identifier -> A | ... | Z 
boolean --> true | false 
digit --> 0 | ... | 9 

Mon programme devrait prendre le fichier source en entrée et imprimer un message qui dit que le programme est syntaxiquement correct ou non. Comme je n'ai aucune expérience en prologue et que je regarde beaucoup de vidéos sur Youtube et que je lis des didacticiels et des weblogs qui ne me sont d'aucune utilité (du moins par manque d'expérience), j'ai besoin d'aide. Y a-t-il quelqu'un s'il vous plait?

Répondre

1

J'ai résolu cette question. C'était plutôt facile:

program --> ["int"], ["main"], ["("], [")"], ["{"], declarations, 
    statements, ["}"]. 
    declarations --> declaration. 
    declarations --> declaration, declarations. 
    declarations --> []. 

    declaration --> type, identifier, [";"]. 
    declaration --> type, identifier, ["["], digit, ["]"], [";"]. 

type --> ["int"]. 
type --> ["bool"]. 
type --> ["float"]. 
type --> ["char"]. 

statements --> statement. 
statements --> statement, statements. 
statements --> []. 

statement --> [";"]. 
statement --> block. 
    statement --> assignment. 
statement --> if_statement. 
statement --> while_statement. 

block --> ["{"], statements, ["}"]. 

assignment --> identifier, ["["], digit, ["]"], ["="], expression, [";"]. 
if_statement --> ["if"], ["("], expression, [")"], statement. 
while_statement --> ["while"], ["("], expression, [")"], statement. 

expression --> conjunction, conjunctions. 
conjunctions --> ["||"], conjunction. 
conjunctions --> ["||"], conjunction, conjunctions. 
conjunctions --> []. 

conjunction --> equality, equalities. 
equalities --> ["&&"], equality. 
equalities --> ["&&"], equality, equalities. 
equalities --> []. 

equality --> relation. 
equality --> relation, equ_op, relation. 

equ_op --> ["=="]. 
equ_op --> ["!="]. 

relation --> addition. 
relation --> addition, rel_op, addition. 

rel_op --> ["<"]. 
rel_op --> ["<="]. 
rel_op --> [">"]. 
rel_op --> [">="]. 

addition --> term, terms. 
terms --> add_op, term. 
terms --> add_op, term, terms. 
terms --> []. 

add_op --> ["+"]. 
add_op --> ["-"]. 

term --> factor, factors. 
factors --> mul_op, factor. 
factors --> mul_op, factor, factors. 
factors --> []. 

mul_op --> ["*"]. 
mul_op --> ["/"]. 
mul_op --> ["%"]. 

factor --> primary. 
factor --> unary_op, primary. 

unary_op --> ["-"]. 
unary_op --> ["!"]. 

primary --> identifier. 
primary --> identifier, ["["], digit, ["]"]. 
primary --> literal. 
primary --> ["("], expression, [")"]. 
primary --> type, ["("], expression, [")"]. 


literal --> digit. 
literal --> boolean. 


identifier --> ["A"]. 
identifier --> ["B"]. 
identifier --> ["C"]. 
identifier --> ["D"]. 
identifier --> ["E"]. 
identifier --> ["F"]. 
identifier --> ["G"]. 
identifier --> ["H"]. 
identifier --> ["I"]. 
identifier --> ["J"]. 
identifier --> ["K"]. 
identifier --> ["L"]. 
identifier --> ["M"]. 
identifier --> ["N"]. 
identifier --> ["O"]. 
identifier --> ["P"]. 
identifier --> ["Q"]. 
identifier --> ["R"]. 
identifier --> ["S"]. 
identifier --> ["T"]. 
identifier --> ["U"]. 
identifier --> ["V"]. 
identifier --> ["W"]. 
identifier --> ["X"]. 
identifier --> ["Y"]. 
identifier --> ["Z"]. 

boolean -->["true"]. 
boolean --> ["false"]. 


digit --> ["0"]. 
digit --> ["1"]. 
digit --> ["2"]. 
digit --> ["3"]. 
digit --> ["4"]. 
digit --> ["5"]. 
digit --> ["6"]. 
digit --> ["7"]. 
digit --> ["8"]. 
digit --> ["9"].