그래서 C++ 프로그램을 구문 분석하기 위해 BNF-Convertor (BNFC)을 사용하여 문법을 작성했습니다. C++ 프로그램은 다음과 같습니다.C++ 프로그램 용 BNFC 문법 작성
// a small C++ program
#include <iostream>
int main()
{
std::cout << "i";
return 0;
}
내가 작성한 BNF 문법은 다음과 같습니다.
PDefs. Program ::= [Def] ;
terminator Def "" ;
comment "//" ;
comment "/*" "*/" ;
comment "#" ;
DFun. Def ::= Type Id "(" [Arg] ")" "{" [Stm] "}" ;
separator Arg "," ;
terminator Stm "" ;
separator nonempty Id "::" ;
ADecl. Arg ::= Type Id ;
SExp. Stm ::= Exp ";" ;
Sids. Stm ::= Id ;
SDecl. Stm ::= Type Id ";" ;
SDecls. Stm ::= Type Id "," [Id] ";" ;
SInit. Stm ::= Type Id "=" Exp ";" ;
SReturn. Stm ::= "return" Exp ";" ;
SWhile. Stm ::= "while" "(" Exp ")" Stm ;
SBlock. Stm ::= "{" [Stm] "}" ;
SIfElse. Stm ::= "if" "(" Exp ")" Stm "else" Stm ;
EInt. Exp15 ::= Integer ;
EDouble. Exp15 ::= Double ;
ETrue. Exp15 ::= "true" ;
EFalse. Exp15 ::= "false" ;
EId. Exp15 ::= Id ;
EApp. Exp15 ::= Id "(" [Exp] ")" ;
EStr. Exp15 ::= "\"" Id "\"";
EPIncr. Exp14 ::= Exp15 "++" ;
EPDecr. Exp14 ::= Exp15 "--" ;
EIncr. Exp13 ::= "++" Exp14 ;
EDecr. Exp13 ::= "--" Exp14 ;
ETimes. Exp12 ::= Exp12 "*" Exp13 ;
EDiv. Exp12 ::= Exp12 "/" Exp13 ;
EPlus. Exp11 ::= Exp11 "+" Exp12 ;
EMinus. Exp11 ::= Exp11 "-" Exp12 ;
ELs. Exp9 ::= Exp9 "<<" Exp10 ;
ERs. Exp9 ::= Exp9 ">>" Exp10 ;
ELt. Exp9 ::= Exp9 "<" Exp10 ;
EGt. Exp9 ::= Exp9 ">" Exp10 ;
ELtEq. Exp9 ::= Exp9 "<=" Exp10 ;
EGtWq. Exp9 ::= Exp9 ">=" Exp10 ;
EEq. Exp8 ::= Exp8 "==" Exp9 ;
ENEq. Exp8 ::= Exp8 "!=" Exp9 ;
EAnd. Exp4 ::= Exp4 "&&" Exp5 ;
EOr. Exp3 ::= Exp3 "||" Exp4 ;
EAss. Exp2 ::= Exp3 "=" Exp2 ;
coercions Exp 15 ;
separator Exp "," ;
separator Id "," ;
Tbool. Type ::= "bool" ;
Tdouble. Type ::= "double" ;
Tint. Type ::= "int" ;
Tvoid. Type ::= "void" ;
token Id (letter (letter | digit | '_')*) ;
token Ids (letter)* ;
둘 다 ::
에 대한 규칙을 작성한와 여기 <<
및 >>
오른쪽 시프트 연산자 시프트 연산자 왼쪽하지만 어떤 이유로 제대로 구문 분석 아닙니다. 내가 도대체 뭘 잘못하고있는 겁니까?
내 이해에 따르면이 작동합니다하지만이 오류를 제공합니다.
syntax error at line 6 before << "i" ; return
그건 BNF가 아닙니다. – melpomene
Google에서 "C++ bnf"를 검색하여 [하이퍼 링크 C++ BNF 문법] (http://nongnu.org/hcb/)을 발견했습니다. 언뜻 보면 인상적입니다. C로 실험 한 결과, C 언어는 컨텍스트가없는 것을 기억합니다. (예 : 괄호 안의 표현식을 캐스트 연산자와 구별하기 위해 몇 가지 트릭이 필요했습니다.) 내가들은 바에 따르면 C++에서는 훨씬 더 심각합니다. – Scheff
@rici 어떻게 생각 하나? – Zeist