2009-09-22 2 views
4

Я работаю над парсером на основе Boost Spirit 2.0 для небольшого подмножества Fortran 77. Проблема, с которой я сталкиваюсь, заключается в том, что Fortran 77 ориентирован на столбцы, и я не смог найти что-либо в Духе, которое может позволить своим синтаксическим анализаторам знать столбцы. Есть какой-либо способ сделать это?Разбор столбцов символов в Boost :: Spirit

Мне не нужно поддерживать полный тайный синтаксис Fortran, но он должен иметь возможность игнорировать строки, которые имеют символ в первом столбце (комментарии Fortran), и распознавать строки с символом в шестом столбец как строки продолжения.

Кажется, что люди, имеющие дело с пакетными файлами, по крайней мере имеют такую ​​же проблему с первым столбцом, что и я. Кажется, что у Духа есть синтаксический анализатор конца строки, но не синтаксический анализатор начала строки (и не является парсером столбца (x)).

+0

Woot! У меня есть значок переполненности (http://stackoverflow.com/badges/63/tumbleweed). У Джона Скита нет ни одного из них, и, вероятно, никогда этого не произойдет. :-) –

+0

Это смешно, не спрашивайте меня, как я нашел эту тему. Я только что сделал! – JonH

+0

Ну, добро пожаловать на мой вопрос JonH. Пожалуйста, постарайтесь не сильно расходовать пыль. Я просто все понял, где хочу. :-) –

ответ

4

Ну, так как у меня теперь есть ответ на этот вопрос, я думаю, я должен поделиться им.

Fortran 77, как и все другие языки, которые заботятся о столбцах, является ориентированным на линию языком. Это означает, что ваш парсер должен отслеживать EOL и фактически использовать его при разборе.

Другим важным фактом является то, что в моем случае мне не важно разбирать номера строк, которые Fortran может помещать в ранние столбцы управления. Все, что мне нужно, это знать, когда он говорит мне, что я сканирую остальную часть линии по-разному.

Учитывая эти две вещи, я мог бы полностью справиться с этой проблемой с помощью анализатора прокрутки Spirit. Я написал свою статью

  • пропустить всю строку, если в первом столбце (комментарии) содержится алфавитный символ.
  • пропустите всю строку, если на ней ничего нет.
  • игнорировать предыдущий EOL и все до пятой колонки, если в пятой колонке содержится символ «.». (продолжение линии). Это отбрасывает его на предыдущую строку.
  • пропустить все без 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, поскольку я игнорирую номера строк, а разные компиляторы имеют разные правила для допустимых символов комментария и продолжения.

+0

FYI: Это код Spirit 2.1, что означает, что он работает с недавно выпущенным Boost (1.41), но не может компилироваться с более ранними версиями. –

Смежные вопросы