문제

나는 작업 중입니다 정신력 강화 Fortran 77의 작은 하위 집합에 대한 2.0 기반 파서입니다.내가 겪고 있는 문제는 Fortran 77이 열 지향적이며 Spirit에서 파서가 열을 인식하도록 허용할 수 있는 어떤 것도 찾을 수 없다는 것입니다.이를 수행할 수 있는 방법이 있습니까?

전체 난해한 Fortran 구문을 지원할 필요는 없지만 첫 번째 열에 문자가 있는 줄(Fortran 주석)을 무시하고 여섯 번째 열에 문자가 있는 줄을 연속 줄로 인식할 수 있어야 합니다. .

배치 파일을 다루는 사람들은 적어도 나와 같은 첫 번째 열 문제를 겪고 있는 것 같습니다.Spirit에는 줄 끝 구문 분석기가 있는 것으로 보이지만, 줄 시작 구문 분석기는 없습니다(그리고 확실히 열(x) 구문 분석기도 아닙니다).

도움이 되었습니까?

해결책

글쎄요, 이제 이에 대한 답을 얻었으니 공유해야 할 것 같습니다.

열을 관리하는 다른 모든 언어와 마찬가지로 Fortran 77은 줄 지향 언어입니다.이는 파서가 EOL을 추적하고 실제로 파싱에 사용해야 함을 의미합니다.

또 다른 중요한 사실은 내 경우에는 Fortran이 초기 제어 열에 넣을 수 있는 줄 번호를 구문 분석하는 데 신경 쓰지 않았다는 것입니다.나에게 필요한 것은 나머지 줄을 다르게 스캔하라는 메시지가 언제 표시되는지 아는 것입니다.

이 두 가지 사항을 고려하면 Spirit 건너뛰기 파서로 이 문제를 완전히 처리할 수 있습니다.나는 내 것을 썼다

  • 첫 번째(주석) 열에 알파벳 문자가 포함되어 있으면 전체 줄을 건너뜁니다.
  • 내용이 없으면 전체 줄을 건너뜁니다.
  • 다섯 번째 열에 ''에 ''가 포함 된 경우, 이전의 EOL과 다섯 번째 열까지 모든 것을 무시하십시오. (연속선).그러면 앞 줄에 고정됩니다.
  • 얼이 아닌 공백을 모두 건너뜁니다(Fortran에서는 공백도 중요하지 않습니다.예, 이상한 언어입니다.)

코드는 다음과 같습니다.

        skip = 
            // Full line comment
            (spirit::eol >> spirit::ascii::alpha >> *(spirit::ascii::char_  - spirit::eol))
            [boost::bind (&fortran::parse_info::skipping_line, &pi)]
        |  
            // remaining line comment
            (spirit::ascii::char_ ('!') >> *(spirit::ascii::char_ - spirit::eol)
             [boost::bind (&fortran::parse_info::skipping_line_comment, &pi)])
        |
            // Continuation
            (spirit::eol >> spirit::ascii::blank >> 
             spirit::qi::repeat(4)[spirit::ascii::char_ - spirit::eol] >> ".")
            [boost::bind (&fortran::parse_info::skipping_continue, &pi)]

        |   
            // empty line 
            (spirit::eol >> 
             -(spirit::ascii::blank >> spirit::qi::repeat(0, 4)[spirit::ascii::char_ - spirit::eol] >> 
               *(spirit::ascii::blank) ) >> 
             &(spirit::eol | spirit::eoi))
            [boost::bind (&fortran::parse_info::skipping_empty, &pi)]
        |   
            // whitespace (this needs to be the last alternative).
            (spirit::ascii::space - spirit::eol)
            [boost::bind (&fortran::parse_info::skipping_space, &pi)]
        ;

나는 줄 번호를 무시하고 컴파일러마다 유효한 주석 및 연속 문자에 대한 규칙이 다르기 때문에 줄 지향 Fortran에 이것을 맹목적으로 사용하지 말 것을 권합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top