Я работаю с грамматикой Java15 и задаю пару вопросов о том, как работает парсер Rascal и почему некоторые вещи не работают. Учитывая конкретный синтаксис:Анализ, соответствие и ключевые слова
module tests::Concrete
start syntax CompilationUnit =
compilationUnit: TypeDec* LAYOUTLIST
;
syntax TypeDec =
ClassDec
;
syntax ClassDec =
\class: ClassDecHead ClassBody
;
syntax ClassDecHead =
"class" Id
;
syntax ClassBody =
"{" ClassBodyDec* "}"
;
syntax ClassBodyDec =
ClassMemberDec
;
syntax ClassMemberDec =
MethodDec
;
syntax MethodDec =
\method: MethodDecHead
;
syntax MethodDecHead =
ResultType Id
;
syntax ResultType =
\void: "void"
;
syntax Id =
\id: [A-Z_a-z] !<< ID \ IDKeywords !>> [0-9A-Z_a-z]
;
keyword Keyword =
"void"
;
keyword IDKeywords =
"null"
| Keyword
;
lexical LAYOUT =
[\t-\n \a0C-\a0D \ ]
;
lexical ID =
[A-Z_a-z] [0-9A-Z_a-z]*
;
layout LAYOUTLIST =
LAYOUT* !>> [\t-\n \a0C-\a0D \ ] !>> ( [/] [*] ) !>> ( [/] [/] ) !>> "/*" !>> "//"
;
определение АСТ:
module tests::Abstract
data Declaration =
\compilationUnit(list[Declaration] body)
| \package(ID name)
| \import(ID name)
| \class(ID name, list[Declaration] body)
| \method(Type ret, ID name)
;
data Type =
\void()
;
data ID =
\id(str id)
;
и драйвер для загрузки файлов:
module tests::Load
import Prelude;
import tests::Concrete;
import tests::Abstract;
public Declaration load(loc l) = implode(#Declaration, parse(#CompilationUnit, l));
Я нахожу некоторые странности в том, что на самом деле работает и что нет. Если взять программу:
class A {
}
Это разбирает, как ожидалось в: compilationUnit([ class(id("A"),[]) ])
Но разбор и построение AST узлов методов внутри класса, оказывается немного волосатые. Учитывая программу:
class A {
void f
}
это производит ошибку "Cannot find a constructor for Declaration"
. Если я изменить синтаксис быть:
syntax MethodDecHead =
ResultType
;
АСТ быть:
| \method(Type ret)
Я могу получить дерево, я бы ожидать: compilationUnit([class(id("A"),[method(void())])])
У меня много путаницы в том, что происходит здесь, как обрабатываются ключевые слова и что вызывает такое поведение.
В дополнение к этому, если я не добавляю LAYOUTLIST
в конец производства start syntax
, я получаю ParseError
в любое время, когда пытаюсь читать из файла.
Может также вставлять целые файлы примеров здесь. Seen достаточно мало – jurgenv