我正在使用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 \ ] !>> ( [/] [*] ) !>> ( [/] [/] ) !>> "/*" !>> "//"
;
的AST定義:
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 {
}
這解析預期爲: 但是解析和構建AST節點爲類的內部方法被證明是有點毛。鑑於方案:
class A {
void f
}
這產生了一個"Cannot find a constructor for Declaration"
錯誤。如果我修改語法是:
syntax MethodDecHead =
ResultType
;
的AST是:
| \method(Type ret)
我能夠得到的樹我希望:compilationUnit([class(id("A"),[method(void())])])
我有很多對這裏發生的事情感到困惑,如何處理關鍵字以及導致此行爲的原因。
除此之外,如果我不將LAYOUTLIST
添加到start syntax
生產的末尾,我會在任何時候嘗試從文件讀取時獲得ParseError
。
還不如貼在這裏的整個示例文件。看起來足夠小 – jurgenv