Marpa'da yeni bir DSL uyguluyorum ve (Regexp :: Grammars'dan geliyor) memnun kaldım. Dilim, bir grup ikili ve ikili operatörü, C stili tanımlayıcıları olan nesneleri ve tanıdık nokta gösterimini kullanan yöntem çağrılarını desteklemektedir. Örneğin:Marpa: Anahtar kelimeleri tanımlayıcı olarak açıkça reddedebilir miyim?
foo.has(bar == 42 AND baz == 23)
Ben Marpa en dilbilgisi tanımlama dili ile sunulan prioritized rules özelliğini bulundu ve bu çok güvenmek gelmiş, bu yüzden neredeyse tek G1 kural Expression
var. Alıntı (kısaca geçilmiştir birçok alternatifleri ve semantik eylemler): Gördüğünüz gibi, ben Scanless arabirimini (SLIF) kullanıyorum
Expression ::=
NumLiteral
| '(' Expression ')' assoc => group
|| Expression ('.') Identifier
|| Expression ('.') Identifier Args
| Expression ('==') Expression
|| Expression ('AND') Expression
Args ::= ('(') ArgsList (')')
ArgsList ::= Expression+ separator => [,]
Identifier ~ IdentifierHeadChar IdentifierBody
IdentifierBody ~ IdentifierBodyChar*
IdentifierHeadChar ~ [a-zA-Z_]
IdentifierBodyChar ~ [a-zA-Z0-9_]
NumLiteral ~ [0-9]+
. Benim sorunum bu da örneğin, ayrıştırır şudur:
foo.AND(5)
Marpa sadece bir nokta sonra bir tanımlayıcı olamayacağını bilir, bu yüzden bile AND
bir anahtar kelime olabileceği gerçeğini dikkate almaz. AND
'u bir anahtar kelime olarak tanımlayan ayrı bir lexing aşaması yaparak bu problemden kaçınabileceğimi biliyorum, ancak bu minik kağıt parçası çabaya değmez.
Identifier
kuralını yalnızca anahtar kelime olmayan tanımlayıcılarla kısıtlamak için SLIF'de bir yol var mı?
"Anahtar kelime" ile ne demek istiyorsunuz? “assoc” ve “separator”, Marpa lingo'daki anahtar kelimelerdir. – choroba
@choroba, “AND” operatörünü tanımlarsa, tanımlayıcı olarak izin verilmesini istemez. – ikegami
Bunu test etmedim, ancak 'latm' zarfına bakmak isteyebilirsiniz. Bu, Marpa'nın, bir kelimenin tam anlamıyla bir lütuf olduğunu ve böylece bir 'VE' nin tamam olduğunu düşünecek olan, bu nedenle, bir kelimenin tam anlamıyla "aptal" hale getirilmesiyle ilgili olarak, kelimenin tam olarak ne kabul edilebilir olduğu hakkındaki bilgisini kapatmanızı sağlar. ayrıştırmak, istediğin gibi. Bunu belki de daha yüksek bir sözlük önceliği ile birleştirin, böylece bir operatör olarak 'VE' bir tanımlayıcı olarak 'VE' üzerinden tercih edilir. Kafamın üstünden ama umarım yardımcı olur. –