EBNF к синтаксическому анализатору Scala combinator

HC-05 / HC-06 принимает строку как последовательность символов. Если вы хотите отправить 255, то HC-05 принимает это как «2», «5», «5». Итак, ваша первая работа - определить, является ли это целое число или строка. Я добавил другой префикс перед целым числом и строкой и общий постфикс ('#'), по которому я могу определить конец ввода. Надеюсь, это поможет вам.

while (Serial.available()) {

delay(3);  //small delay to allow input buffer to fill

char c = Serial.read();  //gets one byte from serial buffer
if (c == '#') {
  break;
}  //breaks out of capture loop to print readstring
readString += c;
}

Теперь, после того, как вы взяли все биты, вам нужно выяснить, что вы взяли с помощью префикса.

if (readString.charAt(0) == 'i')
{
 //"i255,255,255#"
readString.replace("i", "0");
value1 = readString.substring(1, 3).toInt();
value2 = readString.substring(5, 7).toInt();
value3 = readString.substring(8, 11).toInt();

readString = "";

}
else if (readString.charAt(0) == 's')
{
 //Do as you wish
readString = "";
}
11
задан Daniel O 8 February 2009 в 16:19
поделиться

1 ответ

Я сделал бы это как это:

type E = Expression

def postfixExp = primaryExp ~ rep(
    "[" ~> expr <~ "]" ^^ { e => ElementExpression(_:E, e) }
  | "." ~ "length" ^^^ LengthExpression
  | "." ~> ident ~ ("(" ~> repsep(expr, ",") <~ ")") ^^ flatten2 { (f, args) =>
      CallMethodExpression(_:E, f, args)
    }
) ^^ flatten2 { (e, ls) => collapse(ls)(e) }

def expr: Parser[E] = ...

def collapse(ls: List[E=>E])(e: E) = {
  ls.foldLeft(e) { (e, f) => f(e) }
}

Сокращенный expressions кому: expr для краткости, а также добавил псевдоним типа E по той же причине.

Прием, который я использую здесь для предотвращения ужасного анализа случая, должен возвратить значение функции из внутреннего производства. Эта функция берет Expression (который будет primary) и затем возвращает новое Expression на основе первого. Это объединяет два случая точечной отправки и выражений в скобках. Наконец, collapse метод используется для слияния линейного List из значений функции в надлежащий AST, начиная с указанного первичного выражения.

Отметьте это LengthExpression просто возвращается как значение (использование ^^^) от его соответствующего производства. Это работает, потому что компаньон возражает для классов случая (принимающий это LengthExpression действительно класс случая), расширяют соответствующее делегирование значения функции до их конструктора. Таким образом, функция, представленная LengthExpression берет сингл Expression и возвращает новый экземпляр LengthExpression, точно удовлетворяя наши потребности в древовидной конструкции высшего порядка.

12
ответ дан 3 December 2019 в 09:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: