2010-05-17 2 views
2

Я помогаю своему племяннику выполнять домашнее задание на C, это назначение манипуляции строкой и применение алгоритма Ванга.String Manipulation in C

Здесь представлено представление BNF для ввода.

Какова наилучшая практика для обработки и анализа такого ввода в C? Как разобрать эту структуру без использования struct? Заранее спасибо.

+0

Конвенция SO состоит в том, чтобы добавить тег домашней работы для домашней работы :-) –

+1

Это не строго домашнее задание (он прямо не просит решения упражнения), он просит лучших практик, и он четко заявил что он помогает своему племяннику, поэтому я думаю, что это не требует метки домашней работы ... – Francesco

ответ

3

Самый простой подход - сделать каждое правило (или «производство») функцией. Это называется парсером «рекурсивный спуск».

Напишите две процедуры, которые заглядывают и получат следующий символ.

Это даст вам некоторый код, который выглядит примерно так (в псевдокоде):

// <sequent> ::= <lhs> # <rhs> 
sequent() 
    lhs() 
    if peekchar() != '#' then error 
    else poundsign = nextchar() 
    rhs() 


// <lhs> ::= <formulalist>| ε 
lhs() 
    if peekchar() == EOF 
     return 
    else 
     formula() 

// <rhs> ::= <formulalist>| ε 
rhs() 
    if peekchar() == EOF 
     return 
    else 
     formulalist() 

// <formulalist> ::= <formula>|<formula> , <formulalist> 
formulalist() 
    formula() 
    if peekchar() is ',' 
     comma = nextchar() 
     return formulalist() 

// <formula> ::= <letter>| - <formula>| (<formula><infixop><formula>) 
formula() 
    next = peekchar() 
    if next in A..Z 
     letter 
    else if next is - 
     minus_sign = nextchar() 
     return formula() 
    else 
     formula() 
     infixop() 
     formula() 

// <infixop> ::= & | | | > 
infixop() 
    c = nextchar() 
    if c not in &,|,> then error 

// <letter> ::= A | B | ... | Z 
letter() 
    c = nextchar() 
    if c not A..Z then error 

и так далее, для каждого правила.

Основная идея:

  • каждое правило является функцией
  • в определенных точках функция заглядывает вперед, чтобы увидеть, что делать. например, formula() проверяет, является ли первый символ знаком минус.
+0

ε означает «пустой», а не конец файла. Ваша функция для LHS должна быть соответствующим образом изменена. Кроме того, lhs называет фиормулу, а не формулу, которая, я думаю, является опечаткой. – JeremyP

+1

Спасибо за ответ, с некоторыми улучшениями, работает алгоритм. –

0

Поскольку у вас уже есть ваш BNF, самым простым способом анализа такого рода ввода будет использование генератора синтаксического анализатора. Но из-за того, что это домашнее задание, я не уверен, что использование генератора разрешено.

Тем не менее, вы также можете использовать рукописный парсер. Просто выполните поиск рекурсивных парсеров спуска ...